Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们需要使用WAIT终止,而不仅仅是SHUTDOWNOW()?_Java_Thread Safety_Executorservice - Fatal编程技术网

Java 为什么我们需要使用WAIT终止,而不仅仅是SHUTDOWNOW()?

Java 为什么我们需要使用WAIT终止,而不仅仅是SHUTDOWNOW()?,java,thread-safety,executorservice,Java,Thread Safety,Executorservice,我遵循oracle建议的关闭executor服务的标准流程。以下是推荐的代码: void shutdownAndAwaitTermination(ExecutorService pool) { pool.shutdown(); // Disable new tasks from being submitted try { // Wait a while for existing tasks to terminate if (!pool.awaitTerminat

我遵循oracle建议的关闭executor服务的标准流程。以下是推荐的代码:

 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();
   }
 }
我通读了有关
shutdown()
waitivetermination
shutdownow()
的说明

我理解
shutdown()
仅停止提交新线程

等待终止
等待正在运行的线程关闭。如果已完成执行、超时或当前线程之一中断,则返回一个值

shutdownNow()
使用
Thread.interrupt()
中断线程

我的问题是,如果我确定我的线程只使用
sleep
,它可以被
Thread.interrupt()
中断。是否仍有一个值可调用,如oracle推荐的那样

我知道
shutdownNow()
可能有机会不关闭线程,但是为什么我们不能继续这样做来强制停止线程,然后看看是否还有线程没有停止

pool.shutdown();
pool.shutdownNow();
  try {
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
           System.err.println("Pool did not terminate");
     }
   } 
“标准进程”只是试图优雅地处理关闭,前提是在不必要时不要中断线程


首先,它停止接受新任务提交,并让正在进行的任务完成其工作。只有当他们没有在宽限期内完成时,才会进行强制终止。

Ohhhh!!!!是的,你是对的,所以我的代码不仅仅是睡觉,它先睡一会儿,然后开始做其他事情。在这种情况下,当我的代码执行其他操作时,如果我不使用waitTermination,并且其他操作运行很长时间,它不会立即终止,对吗?我的目的是在调用
关机和waitTermination()时立即停止。但是根据建议,它仍然允许宽限期来完成正在进行的任务。如果我现在只想停止,还需要调用第一个等待终止吗?从前面的评论中,我意识到我的线程不仅进行睡眠,而且还有其他进程在其中,因此如果我在线程处于另一进程时触发shutdownNow,它将不会正确终止?对吗?@MalcolmLiu只要你不需要文档中建议的额外努力,你的关闭方法是完全正确的。您需要检查您的用例并决定是否可以跳过它。请记住,一旦您调用
shutdownNow
InterruptedException
将在这些线程中抛出),您的线程将很有可能被中止。谢谢@jannis这确实帮助我清理了这些内容。