Java executor.shutDownNow()不会停止内部方法的执行
我创建了一个未来任务,并将其提交给Executor。在run()方法中,我创建了placementPlanner的一个对象。这个类中的方法调用其他类。但是,当我调用executor.shutDownNow()时,调用的内部方法不会停止执行。如何调用我杀死所有子线程并停止调用方法。代码如下Java executor.shutDownNow()不会停止内部方法的执行,java,Java,我创建了一个未来任务,并将其提交给Executor。在run()方法中,我创建了placementPlanner的一个对象。这个类中的方法调用其他类。但是,当我调用executor.shutDownNow()时,调用的内部方法不会停止执行。如何调用我杀死所有子线程并停止调用方法。代码如下 static List<Result> invokePlacementPlannerWithTimeout(int timeoutSecs, final String request
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;
}
静态列表调用PlacementPlannerWithTimeout(int-timeoutSecs,
最终字符串requestType,最终RequestMap RequestMap,
最终发布地图发布地图,最终系统配置系统配置,
最终请求,最终SigmaBlade主机数据,
最终ServiceLevelData ServiceLevelData,
最终列表serviceList,最终字符串transactionID)引发IOException{
/**
*用于定时执行放置的ExecutorService接口的对象
*计划者。
*/
ExecutorService executor=Executors.newFixedThreadPool(1);
/**
*创建结果类型的最终列表。
*/
最终列表结果列表=新的ArrayList();
/**
*设置执行器线程工作
*/
Future=executor.submit(new Runnable()){
公开募捐{
试一试{
结果=新结果();
PlacementPlanner planner=新的PlacementPlanner();
result.setRequestMapACK(planner.getRequestResult(
requestMap、systemConfig、request、hostData、,
serviceLevelData、transactionID、,
配置文件位置);
结果列表。添加(结果);
}捕获(例外e){
System.out.println(“invokePlacementPlannerWithTimeout方法在控制器中的运行方法中出现异常”);
抛出新的运行时异常(e);
}
}
});
试一试{
/**
*调用具有指定超时的未来任务。
*/
//System.out.println(timeoutSecs);
get(timeoutSecs,TimeUnit.ms);
/**
*成功执行后关闭服务。
*/
执行者。关机现在();
}捕获(例外e){
/**
*如果发生超时,请关闭服务。
*/
执行者。关机现在();
/**
*取消任务以供将来使用。
*/
future.cancel(true);
System.out.println(“发生超时”);
Runtime.getRuntime().exec(“taskkill/F/IM”+“QNSim.exe*”;
}
返回结果列表;
}
根据
除了尽最大努力尝试停止处理外,没有其他保证
积极执行任务。例如,典型的实现将
通过Thread.interrupt()取消,因此任何未能响应
中断可能永远不会终止
因此,shutdownNow()
不能保证任务立即终止。根据
除了尽最大努力尝试停止处理外,没有其他保证
积极执行任务。例如,典型的实现将
通过Thread.interrupt()取消,因此任何未能响应
中断可能永远不会终止
因此,
shutdownNow()
不能保证任务立即终止。如果要取消将中断运行任务的任务,则应使用future.cancel()
,前提是maybruptfrunning
值为true。
shutdownow
最终将尝试使用Thread.interrupt()
取消线程,我想这是您不想做的
另一种方法是检查run方法中的状态,如果它为true,则在调用
shutdownNow
或cancel
时,代码将中断。如果maybruptfrunning
值为true,则应使用future.cancel()
取消将中断正在运行的任务的任务。
shutdownow
最终将尝试使用Thread.interrupt()
取消线程,我想这是您不想做的
另一种方法是在run方法中检查状态,如果它是真的,那么在调用<代码> StudiWOW 或“代码>取消/ <代码> < /P> > P > >时,您的代码将中断。如果<强>真正的< /强>需要停止该线程,则可以考虑使用弃用的<代码>线程。但只有在仔细阅读javadoc的
@弃用部分之后
(我希望这个答案有很多的下注)。
< P>如果你<强>真正的< /强>需要停止那个线程,你可以考虑使用弃用的<代码>线程。但只有在仔细阅读javadoc的@弃用部分之后
(我希望这个答案会有很多人投反对票)。(你应该做的是让你的线程可以正常中断。这可能是关于如何正确处理中断的最好来源。(你应该做的是让你的线程可以正常中断。这可能是关于如何正确处理中断的最好来源。)。