在处理关闭磁带库时未正确清理线程的第三方库时有哪些变通方法?
许多库为其中包含的代码显式或隐式地公开生命周期方法。例如,Web应用程序框架存在于servlet容器中的Web应用程序上下文中。创建上下文时,由于各种原因,框架可能会启动一些线程。
现在,进一步举例说明,当关闭servlet容器或Web应用程序上下文时,Web应用程序框架应该终止所有这些线程。应该关闭库创建的ExecutorService,或者应该制定一些其他方法来停止这些线程。
最糟糕的是线程是non-daemon threads。这些实际上会停止Java进程的终止。但即使它们是守护程序线程,允许线程继续也可能是不好的做法。如果(回到示例)servlet容器嵌入在其他代码中,其他代码可能继续运行,线程仍在继续,这可能会导致问题。
没有以编程方式暴露这些线程,所以可以做些什么?
如果您正在使用这样的第三方库,那么强制关闭现有线程的方法是什么?
答案 0 :(得分:5)
如果您正在使用这样的第三方库,那么强制关闭现有线程的方法是什么?
一般来说,没有一种安全的方法可以保证在所有情况下都能正常工作。您可能最接近安全解决方案的方法是使用ThreadGroup
枚举所有现有线程,并使用Thread.interrupt()
告诉每个线程停止。当然,无法保证线程会引起注意,或者它们会在响应中断时干净地关闭。
IMO,最好的策略是:
如果线程不需要干净地关闭,那么通过调用System.exit()来拉动JVM上的插件
如果线程需要干净地关闭以避免损坏的可能性,那么不要使用库...或者自己解决问题。