为什么我们需要使用 awaitTermination 而不仅仅是 shutdownNow()?

Why do we need to use awaitTermination but not just shutdownNow()?

我正在按照 oracle 推荐的标准流程关闭执行程序服务。这是推荐的代码:

 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()awaitTerminationshutdownNow() 的说明;

我明白
shutdown() 仅停止提交新主题。

awaitTermination 等待 运行 线程关闭。 Returns 如果执行完成、超时或当前线程中断之一,则为一个值。

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

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

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

pool.shutdown();
pool.shutdownNow();
  try {
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
           System.err.println("Pool did not terminate");
     }
   } 

“标准进程”只是尝试优雅地处理关闭,前提是在不需要时不要中断线程。

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