【发布时间】:2013-08-27 11:40:14
【问题描述】:
如何关闭所有使用ExecutorService创建的线程
executor.awaitTermination(1, TimeUnit.DAYS);
完成了吗?
这是线程可以工作的最长时间,如果在某些情况下,其中任何一个没有完成当前任务,请将其关闭并重新开始。
【问题讨论】:
标签: java multithreading wait executorservice
如何关闭所有使用ExecutorService创建的线程
executor.awaitTermination(1, TimeUnit.DAYS);
完成了吗?
这是线程可以工作的最长时间,如果在某些情况下,其中任何一个没有完成当前任务,请将其关闭并重新开始。
【问题讨论】:
标签: java multithreading wait executorservice
如果awaitTermination 返回true,则所有线程都已关闭。
如果awaitTermination返回false,那么部分线程显然没有响应中断*,而除了退出java进程,你能做的也不多了……
*如果线程运行的任务是你的,请确保它们通过快速退出来响应中断,awaitTermination 会及时返回。
【讨论】:
没有简单的方法可以做到这一点。您可以使用将创建守护线程的 ThreadFactory,然后在主线程中运行 awaitTermination,然后运行 shutdownNow。这将(希望)关闭整个 JVM,在给定的情况下,没有什么比这更好的了。执行System.exit() 是一个更加严厉的措施。
请注意,中断甚至停止线程并不能保证它们会真正终止。
【讨论】:
java.io 是不可中断的,对吧?所以它可能仍然挂起。
您可以调用 System.exit(1) 来停止应用程序。如果您不想退出,那么您应该设计您的任务,以便它们正确响应 Thread.interrupt,没有其他方法。
【讨论】:
while(true) 循环中,我需要在重新进入循环之前关闭所有线程。