无头JAR可以为主线程添加一个关闭钩子吗?

时间:2013-07-04 21:10:49

标签: java multithreading concurrency runtime shutdown-hook

我想创建一个可重用的JAR,我将分享我的许多项目。在这个JAR中,当调用某个方法时,需要创建几个线程。

我希望能够添加一个关闭钩子(Runtime.addShutdownHook(...))来帮助这些生成的线程正常关闭,但不确定我是否可以在“无头”内执行此操作(不是{{1}方法)JAR。

所以我问:任何JAR中的任何方法都可以访问“主”线程并为其添加一个关闭钩子吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:0)

对于允许添加关闭钩子的内容没有任何限制,因此它应该按照您的意图工作。唯一的限制可能是SecurityManager,它会阻止您的代码插入钩子。因此,请确保您的项目不使用SecurityManager,或者您的代码具有添加挂钩的权限。

请注意,当JVM被终止时,您的关闭挂钩可能无法运行。

答案 1 :(得分:0)

您不需要访问主线程来添加关闭钩子,您只需要让任何线程调用您的代码,并为该调用的代码添加关闭钩子。

实现此目的的一种方法是在类中使用静态初始化程序块。这样当你加载/调用类时,初始化程序将运行并且你的关闭钩子将被添加。如果您有多个可以调用的类,那么您可能需要创建一个所有类都导入的单个初始化类。

或者,更简洁的设计可能是在启动线程时添加关闭钩子,只需确保验证没有添加关闭钩子(AtomicBoolean应足以用作检查)因为你不想创建内存泄漏。