将来のタスクを作成し、Executor に送信しました。run() メソッドで、placementPlanner のオブジェクトを作成しました。このクラスのメソッドは、他のクラスを呼び出します。ただし、executor.shutDownNow() を呼び出すと、呼び出された内部メソッドは実行を停止しません。すべての子スレッドを強制終了し、メソッドの呼び出しを停止する方法を呼び出します。コードは以下です。
static List<Result> invokePlacementPlannerWithTimeout(int timeoutSecs,
final String requestType, final RequestMap requestMap,
final ReleaseMap releaseMap, final SysConfig systemConfig,
final Request request, final SigmaBlade hostData,
final ServiceLevelData serviceLevelData,
final List<Service> serviceList, final String transactionID) throws IOException {
/**
* Object of ExecutorService interface used for timed execution of Placement
* Planner.
*/
ExecutorService executor = Executors.newFixedThreadPool(1);
/**
* Creating a final List of Result type.
*/
final List<Result> resultList = new ArrayList<Result>();
/**
* set the executor thread working
*/
Future<?> future = executor.submit(new Runnable() {
public void run() {
try {
Result result = new Result();
PlacementPlanner planner = new PlacementPlanner();
result.setRequestMapACK(planner.getRequestResult(
requestMap, systemConfig, request, hostData,
serviceLevelData, transactionID,
configFileLocation));
resultList.add(result);
} catch (Exception e) {
System.out.println("Exception in run method in invokePlacementPlannerWithTimeout method in Controller");
throw new RuntimeException(e);
}
}
});
try {
/**
* invoking the future task with specified timeout.
*/
// System.out.println(timeoutSecs);
future.get(timeoutSecs, TimeUnit.MILLISECONDS);
/**
* Shutting down the service after successful execution.
*/
executor.shutdownNow();
} catch (Exception e) {
/**
* Shutting down the service if timeout is occured.
*/
executor.shutdownNow();
/**
* Canceling the task for future use.
*/
future.cancel(true);
System.out.println("Timeout Occureed.");
Runtime.getRuntime().exec("taskkill /F /IM " + "QNSim.exe*");
}
return resultList;
}