5

我有以下代码

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

            }
   });

es.shutdownNow();

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

那么为什么 ES 无法关闭呢?

4

5 回答 5

13

我这样做了,它奏效了:

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

            }
   });

   es.shutdownNow();

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

于 2013-05-13T03:57:14.313 回答
1

您不能关闭拒绝终止的线程。这就像你不能强制一个线程终止,当它运行一个无限循环时。

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

因此,除非您的线程响应中断(请参阅http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html),否则shutdownNow()终止线程无能为力。

于 2013-05-13T03:53:45.203 回答
1

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();
于 2013-05-13T05:42:28.677 回答
0

文档中的关键词是“尝试”。通过while(true)在循环中使用简单,您就不会让线程有机会被中断。尝试sleep()在循环中调用。

于 2013-05-13T03:55:27.247 回答
-1

请试试这个

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

}); es.shutdownNow();

于 2018-12-03T07:01:03.277 回答