Java ExecutorService ShutdownNow需要时间

时间:2014-02-20 14:55:57

标签: java multithreading executorservice java.util.concurrent

我有一个Java ExecutorService(固定线程池为1),我将可运行的任务传递给将来执行。每项任务通常在10秒内完成。 ExecutorService只是简单地完成任务。如果我关闭了我的应用程序,请执行以下操作;

if (taskProcessor != null) {
    taskProcessor.shutdownNow();
    while (!taskProcessor.isTerminated()) {
        // Wait For All Submitted Tasks To Finish
    }
}

问题是它似乎需要一段时间才能关闭,有时它可能需要几分钟,有时似乎永远不会关闭,有时它会在几秒钟内关闭!在执行程序队列中的任何时候都可能有大约2000个任务,但我只是希望它完成它正在执行的当前任务并退出。我在这里做错了什么?

3 个答案:

答案 0 :(得分:0)

这一切都取决于正在执行的任务。在所有任务结束之前,ThreadPoolExecutor不会结束。 shutdownNow()会中断所有任务,但任务可能会忽略它。

答案 1 :(得分:0)

您没有按照正确的顺序关闭ExecutorService

您必须按oracle

的建议按特定顺序致电shutdownshutdownNowawaitTermination
void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // Disable new tasks from being submitted
   try {
     // Wait a while for existing tasks to terminate
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow(); // Cancel currently executing tasks
       // Wait a while for tasks to respond to being cancelled
       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
           System.err.println("Pool did not terminate");
     }
   } catch (InterruptedException ie) {
     // (Re-)Cancel if current thread also interrupted
     pool.shutdownNow();
     // Preserve interrupt status
     Thread.currentThread().interrupt();
   }
 }

答案 2 :(得分:0)

您可以通过不让代码忙于等待来做得更好。这将释放CPU以完成任务。并防止争用isTerminated使用的任何锁。