如何处理不停止线程的行为不当的库

Dan*_*ell 7 java multithreading

在处理关闭库时未正确清理线程的第三方库时,有哪些变通方法?

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

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

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

没有以编程方式暴露这些线程,所以可以做些什么?

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

Ste*_*n C 5

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

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

IMO,最好的策略是:

  • 如果线程不需要干净地关闭,那么通过调用System.exit()来拔出JVM上的插件

  • 如果线程需要干净地关闭以避免损坏的可能性,那么不要使用库...或自己解决问题.

  • +1您可以运行库是一个单独的过程,可以减少杀死进程的影响.(适用于JNI图书馆) (3认同)