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