8

在处理库关闭时无法正确清理线程的第三方库时,有哪些解决方法?

许多库显式或隐式地为其中包含的代码公开生命周期方法。例如,Web 应用程序框架存在于 servlet 容器中的 Web 应用程序上下文中。创建上下文时,框架可能会出于各种原因启动一些线程。

现在,进一步举例,当 servlet 容器或 Web 应用程序上下文关闭时,Web 应用程序框架应该终止所有这些线程。应该关闭由库创建的ExecutorService,或者应该制定一些其他停止这些线程的方法。

最坏的情况是线程是非守护线程。这些实际上会停止 Java 进程的终止。但即使它们是守护线程,允许线程继续运行也可能是不好的做法。如果(回到示例)servlet 容器嵌入在其他代码中,其他代码可能会继续运行,而线程仍在运行,这可能会导致问题。

没有公开的编程方式来停止这些线程,那么可以做些什么呢?

如果您正在使用这样的第三方库,有什么方法可以强制关闭现有线程?

4

1 回答 1

5

如果您正在使用这样的第三方库,有什么方法可以强制关闭现有线程?

一般来说,没有一种安全的方法可以保证在所有情况下都有效。最接近安全解决方案的方法是使用ThreadGroup枚举所有现有线程,并使用Thread.interrupt()告诉每个线程停止。当然,不能保证线程会注意,或者它们会干净地关闭以响应中断。

IMO,最好的策略是:

  • 如果线程不需要干净地关闭,则通过调用 System.exit() 拔掉 JVM 上的插头

  • 如果需要彻底关闭线程以避免损坏的可能性,请不要使用该库......或者自己解决问题。

于 2012-08-10T13:14:46.230 回答