如何实现在执行结束时自动关闭的线程池?

我正在编写一个理论上可以在不同环境中使用的Java客户端:Java main(),servlet容器或dependency injection。

客户端实现内部连接线程池。

这种方法的问题在于,客户端的用户不知道实现内部线程池的事实将使他或她的应用程序在关闭时“挂起”。 我的用户需要知道向库发送shutdown()消息。

我想知道是否可以采取任何其他替代方法,一方面,允许我为我的连接启动一个线程池; 而且,另一方面,捕获一些事件,可能是一个JVM事件,表明JVM正在关闭,这将允许我调用我的shutdown()实现。

虽然你可以添加钩子,如前面所建议的那样,你仍然可能遇到的问题是线程池仍然有活动线程。

我相信如果你将你的个别线程标记为“守护进程”(通过Thread.setDaemon方法),那么如果只剩下守护进程线程,JVM将无法保持活动状态。

来自JavaDoc:

将此线程标记为守护程序线程或用户线程。 当运行的唯一线程都是守护程序线程时,Java虚拟机将退出。

使用此方法,如果您的主要非守护程序线程被终止,则由于另一个线程正在运行,JVM将不会“挂断”,这会触发您的关闭挂钩,而不必向各个线程显式发送终止指令。

Runtime.getRuntime().addShutdownHook()将是我想到的。 http://blog.yohanliyanage.com/2010/10/know-the-jvm-2-shutdown-hooks/有不错的解释。 这有帮助吗?

如果问题是您的代码的用户不知道有一个线程池要关闭,那么解决方案是让他们意识到它? 在相关类的工厂方法或构造函数中,将ExecutorService用作参数,因此调用者负责其生命周期。 也就是说,使用dependency injection来推动策略向上。