1

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

3 回答 3

6

根据javadoc

除了尽最大努力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过 Thread.interrupt() 取消,因此任何未能响应中断的任务可能永远不会终止

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

于 2012-10-23T20:10:46.723 回答
2

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

(我希望这个答案会有很多反对意见)。

于 2012-10-23T20:53:55.937 回答
1

future.cancel()如果您想取消任务,如果mayInterruptIfRunning值为 true ,您应该使用该任务将中断正在运行的任务。shutdownNow最终会尝试取消 Thread.interrupt()我猜你不想做的线程。

另一种方法是在你的运行方法中检查Thread.isInterrupted()状态,如果它真的只是中断,那么你的代码将在你调用shutdownNowcancel

于 2012-10-23T20:12:50.607 回答