ExecutorService没有关闭

时间:2013-05-13 03:51:28

标签: java multithreading

我有以下代码

    ExecutorService es = Executors.newSingleThreadExecutor();
    es.submit(new Runnable() {
           @Override public void run() 
           {
                  while(true);

            }
   });

es.shutdownNow();

问题是我调用shutdownNow后ExecutorService没有关闭。文档说它试图阻止所有正在执行的任务。

那么为什么ES无法关闭?

5 个答案:

答案 0 :(得分:9)

我做到了这一点并且有效:

    ExecutorService es = Executors.newSingleThreadExecutor();
    es.submit(new Runnable() {
           @Override public void run() 
           {
                  while(!Thread.currentThread().isInterrupted());

            }
   });

   es.shutdownNow();

原因是shutdownNow没有终止线程。它只会中断所有正在运行的线程。

答案 1 :(得分:1)

您无法关闭仅拒绝终止的线程。就像你在运行无限循环时强制终止线程一样。

来自shutdownNow()的Javadoc:“除了尽力而为的尝试停止处理主动执行任务之外没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何失败的任务响应中断可能永远不会终止。“

因此,除非你的线程响应一个中断(参见http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html),否则shutdownNow()可以用来终止一个线程。

答案 2 :(得分:0)

文档中的关键词是“尝试”。 通过在循环中使用简单的while(true),您可以让线程无法被中断。 尝试在循环中调用sleep()

答案 3 :(得分:0)

当且仅当线程的执行被中断时,

isInterrupted()才返回true。

     ExecutorService es = Executors.newSingleThreadExecutor();
        es.submit(new Runnable() {
               @Override public void run() 
               {   // infinite loop to process

                       while(true)
                       {                              
                          // We've been interrupted: no more processing.
                          if(Thread.currentThread().isInterrupted()){
                             return;
                           }
                       }

                }
       });
   es.shutdownNow();

答案 4 :(得分:-1)

请尝试这个

ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {
       @Override public void run() 
       {
             try{
                while(true);
             }catch(InterruptException){
                Thread.currentThread().interrupt();
             }
        }

}); es.shutdownNow();