2

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

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

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

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

4

3 回答 3

5

尽管您可以添加钩子,正如之前建议的那样,您仍然可能遇到的问题是线程池仍然有活动线程。

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

来自 JavaDoc:

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

使用这个,如果你的主要非守护线程被终止,JVM 不会因为另一个线程正在运行而“挂起”,这会触发你的关闭钩子,而不必显式地向各个线程发送终止指令。

于 2011-01-22T18:50:35.730 回答
2

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

于 2011-01-22T17:55:22.803 回答
0

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

于 2013-06-15T16:56:07.693 回答