在Java中销毁线程已经被弃用(并且根据javadoc没有实现),而中断它只是一个建议,期望线程退出,但可能不会这样做。 (在JVM内部提供任何杀死线程的方式都是令人不安的设计,但我的问题与设计无关。)
Java应用服务器如何卸载应用程序? 它们是否能够以某种方式销毁被卸载的应用程序的线程? 如果可以,那么如何销毁? 如果不行,那么部署的应用程序中的一个带有无限循环的线程可能会使整个应用服务器崩溃,而没有任何干预的可能性吗?
抱歉我没有为此编写测试用例,但我想知道实际发生了什么。
在Java中销毁线程已经被弃用(并且根据javadoc没有实现),而中断它只是一个建议,期望线程退出,但可能不会这样做。 (在JVM内部提供任何杀死线程的方式都是令人不安的设计,但我的问题与设计无关。)
Java应用服务器如何卸载应用程序? 它们是否能够以某种方式销毁被卸载的应用程序的线程? 如果可以,那么如何销毁? 如果不行,那么部署的应用程序中的一个带有无限循环的线程可能会使整个应用服务器崩溃,而没有任何干预的可能性吗?
抱歉我没有为此编写测试用例,但我想知道实际发生了什么。
编辑 - 对于评论的回应。
thread.destroy()
并不是出于解决互斥死锁的问题而设计的,因为它旨在释放(打破)所有由被销毁线程拥有的互斥锁。问题在于,在锁被打破后,所保护的数据结构是否处于合理状态并没有得到保证。
如果我正确了解这个话题的历史,Thread.suspend()
、Thread.delete()
等方法确实在Java 1.0实际应用中导致了问题。这些问题非常严重,对于应用程序编写者来说很难处理,因此JVM的设计者们决定最好的做法是弃用这些方法。这不是一个容易做出的决定。
现在,如果您勇敢的话,您确实可以使用这些方法。在某些情况下它们可能是安全的。但是,围绕着已经废弃的方法构建应用程序并不是良好的软件工程实践。
在EJB服务器内,您无法创建自己的线程。
在Web容器(例如Tomcat)中生成线程并不罕见,但您确实应该仔细考虑是否这样做,并确保管理这些线程的生命周期。