【问题标题】:Shutdown Executor thread after awaitConfimationawaitConfimation 后关闭 Executor 线程
【发布时间】:2013-08-27 11:40:14
【问题描述】:

如何关闭所有使用ExecutorService创建的线程

executor.awaitTermination(1, TimeUnit.DAYS);

完成了吗?

这是线程可以工作的最长时间,如果在某些情况下,其中任何一个没有完成当前任务,请将其关闭并重新开始。

【问题讨论】:

    标签: java multithreading wait executorservice


    【解决方案1】:

    如果awaitTermination 返回true,则所有线程都已关闭。

    如果awaitTermination返回false,那么部分线程显然没有响应中断*,而除了退出java进程,你能做的也不多了……

    *如果线程运行的任务是你的,请确保它们通过快速退出来响应中断,awaitTermination 会及时返回。

    【讨论】:

    • 我能否以某种方式检测哪些线程仍在运行并手动关闭它们?
    • @Ivan 不,它隐藏在 ExecutorService 的实现中。如果您可以访问线程,您可以尝试将它们作为最后的手段停止,但不能保证它会成功(并且存在潜在问题)。
    【解决方案2】:

    没有简单的方法可以做到这一点。您可以使用将创建守护线程的 ThreadFactory,然后在主线程中运行 awaitTermination,然后运行 ​​shutdownNow。这将(希望)关闭整个 JVM,在给定的情况下,没有什么比这更好的了。执行System.exit() 是一个更加严厉的措施。

    请注意,中断甚至停止线程并不能保证它们会真正终止。

    【讨论】:

    • 感谢您的回复。我根本不想关闭整个 JVM 或应用程序。问题是一些线程正在做一些 JDBC 工作,如果其中任何一个没有完成,我就无法开始与该数据库的连接。如果没有更好的选择,我可以使用 DB 标志或其他东西。
    • @assylias 但是经典的java.io 是不可中断的,对吧?所以它可能仍然挂起。
    【解决方案3】:

    您可以调用 System.exit(1) 来停止应用程序。如果您不想退出,那么您应该设计您的任务,以便它们正确响应 Thread.interrupt,没有其​​他方法。

    【讨论】:

    • 我不想终止应用程序。它在while(true) 循环中,我需要在重新进入循环之前关闭所有线程。
    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2014-03-10
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多