Java executor.shutDownNow()不会停止内部方法的执行

Java executor.shutDownNow()不会停止内部方法的执行,java,Java,我创建了一个未来任务,并将其提交给Executor。在run()方法中,我创建了placementPlanner的一个对象。这个类中的方法调用其他类。但是,当我调用executor.shutDownNow()时,调用的内部方法不会停止执行。如何调用我杀死所有子线程并停止调用方法。代码如下 static List<Result> invokePlacementPlannerWithTimeout(int timeoutSecs, final String request

我创建了一个未来任务,并将其提交给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;
}
静态列表调用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的
@弃用部分之后


(我希望这个答案会有很多人投反对票)。

(你应该做的是让你的线程可以正常中断。这可能是关于如何正确处理中断的最好来源。(你应该做的是让你的线程可以正常中断。这可能是关于如何正确处理中断的最好来源。)。