首页 文章

Java ExecutorService ShutdownNow需要时间

提问于
浏览
0

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

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

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

3 回答

  • 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();
       }
     }
    
  • 0

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

  • 0

    没有让代码忙着等待,你可以做得更好 . 这将释放CPU以完成任务 . 并防止争用isTerminated使用的任何锁 .

相关问题