executor.shutDownNow()不会阻止内部方法执行

时间:2012-10-23 20:08:13

标签: java

我创建了一个未来任务并将其提交给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;
}

3 个答案:

答案 0 :(得分:6)

根据javadoc

  

除了努力尝试停止处理之外,没有任何保证   积极执行任务。例如,典型的实现方式   通过Thread.interrupt()取消,因此任何无法响应的任务   中断可能永远不会终止

因此,shutdownNow()并不能保证任务立即终止。

答案 1 :(得分:2)

如果您确实需要停止该线程,您可以考虑使用已弃用的Thread.stop(),因为这不是唯一有效的方法。但只有在仔细阅读了javadoc的@deprecated部分之后。

(我希望这个答案能有很多下注)。

答案 2 :(得分:1)

如果要取消将在future.cancel()值为true时中断任务的任务,则应使用mayInterruptIfRunningshutdownNow最终将尝试使用Thread.interrupt()取消线程,我猜您不想这样做。

另一种方法是在运行方法中检查Thread.isInterrupted()状态,如果它只是中断,那么当您致电shutdownNowcancel时,您的代码就会中断