我创建了一个未来任务并将其提交给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;
}
答案 0 :(得分:6)
根据javadoc
除了努力尝试停止处理之外,没有任何保证 积极执行任务。例如,典型的实现方式 通过Thread.interrupt()取消,因此任何无法响应的任务 中断可能永远不会终止
因此,shutdownNow()
并不能保证任务立即终止。
答案 1 :(得分:2)
如果您确实需要停止该线程,您可以考虑使用已弃用的Thread.stop()
,因为这不是唯一有效的方法。但只有在仔细阅读了javadoc的@deprecated
部分之后。
(我希望这个答案能有很多下注)。
答案 2 :(得分:1)
如果要取消将在future.cancel()
值为true时中断任务的任务,则应使用mayInterruptIfRunning
。
shutdownNow
最终将尝试使用Thread.interrupt()
取消线程,我猜您不想这样做。
另一种方法是在运行方法中检查Thread.isInterrupted()状态,如果它只是中断,那么当您致电shutdownNow
或cancel
时,您的代码就会中断