处理在库关闭时无法正确清理线程的第三方库时,有哪些解决方法?
许多库显式或隐式地公开其中包含的代码的生命周期方法。例如,Web 应用程序框架存在于 Servlet 容器中的 Web 应用程序上下文中。创建上下文时,框架可能会出于各种原因启动一些线程。
现在,进一步举例,当 servlet 容器或 Web 应用程序上下文关闭时,Web 应用程序框架应该终止所有这些线程。要么执行服务 http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html由库创建的线程应该被关闭,或者应该采取一些其他方法来停止这些线程。
最坏的情况是线程非守护线程 https://stackoverflow.com/questions/2213340/what-is-daemon-thread-in-java。这些实际上会阻止 Java 进程的终止。但即使它们是守护线程,允许线程继续也可能是不好的做法。如果(回到示例)servlet 容器嵌入到其他代码中,则其他代码可能会继续运行,而线程仍然在运行,这可能会导致问题。
没有公开的编程方法来停止这些线程,那么可以做什么呢?
如果您使用这样的第三方库,有哪些方法可以强制关闭现有线程?
如果您使用这样的第三方库,有哪些方法可以强制关闭现有线程?
一般来说,没有一种安全的方法可以保证在所有情况下都有效。最接近安全的解决方案是使用ThreadGroup
枚举所有现有线程,并使用Thread.interrupt()
告诉每个线程停止。当然,不能保证线程会注意,或者它们会干净地关闭以响应中断。
IMO,最好的策略是:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)