【问题标题】:How to implement thread pool that will automatically shutdown at end of execution?如何实现在执行结束时自动关闭的线程池?
【发布时间】:2013-06-16 00:56:07
【问题描述】:
我正在编写一个理论上可以在不同环境中使用的 Java 客户端:Java main()、在 servlet 容器中或通过依赖注入。
客户端实现内部连接线程池。
这种方法的问题在于,不知道内部线程池已实现这一事实的客户端用户将在关闭时看到他或她的应用程序“挂起”。我的用户需要知道向库发送 shutdown() 消息。
我想知道是否可以采取任何其他替代方法,一方面允许我为我的连接启动一个线程池;另一方面,捕获一些事件,可能是 JVM 事件,表明 JVM 正在关闭,这将允许我调用我的 shutdown() 实现。
【问题讨论】:
标签:
java
threadpool
application-shutdown
shutdown-hook
【解决方案1】:
尽管您可以添加钩子,正如之前建议的那样,您仍然可能遇到的问题是线程池仍然有活动线程。
我相信,如果您将各个线程标记为“守护进程”(通过 Thread.setDaemon 方法),那么如果只剩下守护线程,JVM 将无法保持活动状态。
来自 JavaDoc:
将此线程标记为守护线程或用户线程。当唯一运行的线程都是守护线程时,Java 虚拟机退出。
使用这个,如果你的主要非守护线程被终止,JVM不会因为另一个线程正在运行而“挂起”,这会触发你的关闭钩子,而不必显式地向各个线程发送终止指令.
【解决方案3】:
如果问题是您的代码的用户不知道有一个线程池要关闭,也许解决方案是让他们知道它?在相关类的工厂方法或构造函数中,将ExecutorService 用作参数,因此调用者负责其生命周期。也就是说,使用依赖注入来向上推动策略。