![](/img/trans.png)
[英]How does the JVM terminate daemon threads? or How to write daemon threads that terminate gracefully
[英]Does Websphere respect Daemon threads?
我有一个创建大量守护程序线程的应用程序,我希望每个应用程序关闭时关闭它们。
我有点担心想到Websphere 7可能没有关闭它们。
有谁知道Websphere 7是否以不同方式处理Daemons线程? (我知道应该这样做)
注意:我知道什么不应该手动创建线程,我应该使用WebSphere WorkManager或其他东西,但这个应用程序必须在Tomcat和WebSphere中运行。
我知道我应该将所有线程绑定到某个上下文/关闭机制,这正在进行中。
每个WAS服务器都运行一个JVM,守护程序线程与JVM的生命周期相关联,而不是应用程序的生命周期。 因此,您不应期望在应用程序停止时关闭任何守护程序线程。
正如您已经指出的那样,您不应该手动创建线程; Java EE规范禁止这样做,并且Java EE容器中的行为与您已经找到的独立Java应用程序不同。 不幸的是,目前没有WorkManager等效的Java EE标准; 但是, JSR-236 (Java EE的并发实用程序)可能会成为包含在Java EE 7中的候选者。
与此同时,在WAS上,您可以使用异步bean ( WorkManager
)。 我们已成功使用此方法将线程绑定到应用程序生命周期。
但是,由于您还需要在另一个容器(Tomcat)中运行,因此可能还有其他一些选项需要考虑在应用程序中处理并发:
ServletContextListener
挂钩到Web应用程序生命周期 处理并发性的其他一些可能选项包括以下内容,但这些选项需要EJB,这些可能在Tomcat中不可用:
以下是Java EE中并发主题的一些相关主题:
正如已经提到的那样,你不应该这样做,但是没有一个好方法可以做到这一点。 这对我没有造成任何问题。
这种方法需要集中创建线程,并在应用程序停止时使用侦听器来终止线程。
你必须做一些事情:
Websphere只是一个java应用程序。 它不能尊重或不尊重作为JVM或Java运行时环境特征的deamon线程。 因此,如果您在Java EE应用程序中创建deamon线程,它将在每个应用程序服务器中都是deamon。
此外,据我所知,即使您创建常规线程,它也不会阻止应用程序服务器关闭:每个应用程序服务器的关闭机制都会尝试关闭其所有组件,最后运行System.exit()
以赢取犯罪分子: )手动打开线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.