2011-01-22 79 views
2

我正在编写一个Java客户端,它理论上可以在不同的环境中使用:Java main(),在servlet容器中或通过依赖注入。如何实现将在执行结束时自动关闭的线程池?

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

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

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

+0

可能的重复[我在哪里开始调查我的Java过程不会结束?](http://stackoverflow.com/questions/3236427/where-do-i-start-investigating-my-java-process - 即,不会端) – finnw 2011-01-23 17:24:30

回答

5

虽然您可以像以前所建议的那样添加挂钩,但您仍然可能遇到的问题是仍然具有活动线程的线程池。

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

从JavaDoc的:

将该线程标记为守护线程或用户线程。当只有运行的线程都是守护进程线程时,Java虚拟机才会退出。

如果您的主要非守护线程终止,JVM将不会因为其他线程正在运行而“挂断”,并且这会触发您的关闭挂钩,而不必显式发送终止指令到各种线程。

0

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

相关问题