我正在编写一个理论上可以在不同环境中使用的Java客户端:Java main(),servlet容器或依赖注入。
客户端实现内部连接线程池。
这种方法的问题在于,客户端的用户不知道内部线程池的实现这一事实将使他或她的应用程序在关闭时“挂起”。我的用户需要知道向库发送shutdown()消息。
我想知道是否可以采取任何其他替代方法,一方面,允许我为我的连接启动一个线程池;而且,另一方面,捕获一些事件,可能是一个JVM事件,表明JVM正在关闭,这将允许我调用我的shutdown()实现。
答案 0 :(得分:5)
虽然你可以像之前的建议一样添加钩子,但你仍然可能遇到的问题是线程池仍然有活动线程。
我相信如果你将你的个别线程标记为“守护进程”(通过Thread.setDaemon方法),那么如果只剩下守护进程线程,JVM将无法保持活动状态。
来自JavaDoc:
将此线程标记为守护程序线程或用户线程。当运行的唯一线程都是守护程序线程时,Java虚拟机将退出。
使用此方法,如果您的主非守护程序线程被终止,JVM将不会因为另一个线程正在运行而“挂起”,并且这会触发您的关闭挂钩而无需向各个线程显式发送终止指令
答案 1 :(得分:2)
Runtime.getRuntime().addShutdownHook()
。 http://blog.yohanliyanage.com/2010/10/know-the-jvm-2-shutdown-hooks/有不错的解释。这有帮助吗?
答案 2 :(得分:0)
如果问题是您的代码的用户不知道有一个线程池要关闭,那么解决方案是让他们意识到它?在相关类的工厂方法或构造函数中,将ExecutorService
用作参数,因此调用者负责其生命周期。也就是说,使用依赖注入来推动策略向上。