java应用程序服务器能够破坏线程吗?如果是,如何进行?

java应用程序服务器能够破坏线程吗?如果是,如何进行?,java,multithreading,jvm,appserver,Java,Multithreading,Jvm,Appserver,在Java中,销毁线程是不推荐的(并且不是根据javadoc实现的),中断线程只是一个建议,线程可能会退出,但可能不会退出。(不提供任何方法杀死JVM内的线程是一种令人不安的设计,但我的问题与设计无关。) Java应用服务器如何卸载应用程序?它们是否能够以某种方式破坏正在卸载的应用程序的线程?如果是,如何进行?如果没有,那么一个部署的应用程序的单个线程和一个无限循环可能会导致整个应用程序服务器崩溃,而不可能进行干预 很抱歉,我没有为此编写测试用例,但我想知道那里到底发生了什么。不允许您在ejb服

在Java中,销毁线程是不推荐的(并且不是根据javadoc实现的),中断线程只是一个建议,线程可能会退出,但可能不会退出。(不提供任何方法杀死JVM内的线程是一种令人不安的设计,但我的问题与设计无关。)

Java应用服务器如何卸载应用程序?它们是否能够以某种方式破坏正在卸载的应用程序的线程?如果是,如何进行?如果没有,那么一个部署的应用程序的单个线程和一个无限循环可能会导致整个应用程序服务器崩溃,而不可能进行干预


很抱歉,我没有为此编写测试用例,但我想知道那里到底发生了什么。

不允许您在ejb服务器中创建自己的线程

在web容器(例如tomcat)中生成线程并不少见,但您应该认真考虑这样做,并确保管理这些线程的生命周期

不提供任何方法杀死JVM内的线程是一个令人不安的设计,但我的问题与设计无关

既然你真正的问题已经得到了回答,我就要回答上面引用的句子

历史是,Java设计人员最初确实试图解决终止和挂起线程的问题,但他们遇到了一个根本问题,在Java语言环境中无法解决

问题在于,您无法安全地杀死可以以非原子方式改变共享数据或可以使用等待/通知机制与其他线程同步的线程。如果您确实在这种上下文中实现了线程终止,那么您将得到数据结构的部分更新,而其他线程将等待永远不会到达的通知。换句话说,终止一个线程可能会使应用程序的其余部分处于不确定和中断状态

<> P>其他语言/库(例如C、C++、C)允许线程的损坏与上面所描述的相同,即使相关的规范/教科书也不清楚这点。 虽然有可能杀死线程,但在设计和实现整个应用程序时必须非常小心,才能安全地完成这项工作。总的来说,这太难了

那么(假设)在Java中,怎样才能保证线程杀戮的安全呢?以下是一些想法:

  • 如果您的JVM实现了隔离,那么您可以启动您可能希望在子隔离中终止的计算。问题是,一个正确实现的隔离只能通过消息传递与其他隔离进行通信,而它们的使用成本通常要高得多

  • 共享可变状态的问题可以通过完全禁止变异或向Java执行模型中添加事务来解决。这两者都将从根本上改变Java

  • 等待/通知的问题可以通过使用集合或消息传递机制来解决,该机制允许通知“其他”线程它正在与之交互的线程已经消失。“其他”线程仍然需要编码才能从中恢复

编辑-响应命令

互斥锁死锁对于
thread.destroy()
不是问题,因为它被设计为释放(中断)被销毁线程拥有的所有互斥锁。问题在于,无法保证受互斥体保护的数据结构在锁被破坏后会处于正常状态

如果我正确理解了本主题的历史,
Thread.suspend()
Thread.delete()
等等确实在现实世界的Java 1.0应用程序中造成了问题。这些问题非常严重,应用程序编写人员很难处理,因此JVM设计人员决定最好的做法是不推荐这些方法。这不是一个容易做出的决定


现在,如果你勇敢,你可以实际使用这些方法。在某些情况下,它们可能是安全的。但是,围绕不推荐的方法构建应用程序不是可靠的软件工程实践。

当bean在其方法之一中“实现”了无限循环时,应用程序服务器可以做什么?整个应用服务器需要在操作系统级别重新启动?@sibidiba-是。仅此而已。我不是一个硬核JVM设计师,但所有关于delock的争论似乎都是虚构的。禁用此功能并不会使Java容易死锁。我只是做了一个锁,从来没有解锁它。允许thread.destroy()确实会引入一种新的死锁可能性,但为什么在这个世界上我不被允许杀死一个不包含任何资源的线程(根据程序员或JVM)?@sibida:早在几年前,我一直使用不推荐的方法来销毁线程,我知道销毁线程是“安全的”,而且我从来没有遇到过任何问题。。。但我早就不再做这样的事情了:总有一种方法可以“取消”你控制的线程,要么关闭一些套接字,要么在阻塞队列上放置毒药,要么将一些“shouldExit”布尔值设置为true,等等。我过去认为真的需要“destroy”并一直这样做,但现在我不再这样做了。总有另一条路,对吧?如果无法“干净地”取消线程,会出现什么情况?