代码之家  ›  专栏  ›  技术社区  ›  sibidiba

Java应用程序服务器能够销毁线程吗?如果是,怎么办?

  •  6
  • sibidiba  · 技术社区  · 16 年前

    销毁线程在Java中被禁止(而不是根据JavaDoc实现),并且中断它只是一个建议,在线程上预期退出,但可能不这样做。(不提供任何方法杀死J内的螺纹 虚拟机 是一个令人不安的设计,但我的问题与设计无关。)

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

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   nos    16 年前

    不允许在EJB服务器内创建自己的线程。

    在Web容器(如Tomcat)中生成线程并不少见,尽管您应该认真考虑这一点,并确保管理这些线程的生命周期。

        2
  •  11
  •   Stephen C    16 年前

    不提供任何方法杀死J内的螺纹 虚拟机 是一个令人不安的设计,但我的问题与设计无关。

    既然你真正的问题已经被回答了,我将在上面的引文中说明。

    历史是最初的Java设计者 试图解决杀死和挂起线程的问题,但是它们遇到了一个根本问题,它们无法在Java语言的上下文中解决。

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

    允许你杀死线程的其他语言/库(例如,C、C++、C)遭受了我上面描述的相同的问题,即使相关的规范/文本书不清楚这一点。 虽然可能会杀死线程,但您必须在整个应用程序的设计和实现中非常小心,才能安全地完成这项工作。一般来说,很难纠正。

    所以(假设)在Java中线程安全是什么?以下是一些想法:

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

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

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

    编辑 -响应命令。

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

    如果我正确理解这个话题的历史, Thread.suspend() , Thread.delete() 等等。 真的做到了 在现实世界Java 1应用程序中引起问题。这些问题非常严重,应用程序编写人员很难处理,所以JVM设计人员认为最好的方法是对这些方法进行贬低。这不是一个容易做出的决定。

    现在,如果你勇敢,你可以使用这些方法。在某些情况下,它们可能是安全的。但围绕已弃用的方法构建应用程序并不是一种良好的软件工程实践。