繁体   English   中英

Websphere是否尊重守护程序线程?

[英]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上,您可以使用异步beanWorkManager )。 我们已成功使用此方法将线程绑定到应用程序生命周期。

但是,由于您还需要在另一个容器(Tomcat)中运行,因此可能还有其他一些选项需要考虑在应用程序中处理并发:

处理并发性的其他一些可能选项包括以下内容,但这些选项需要EJB,这些可能在Tomcat中不可用:

以下是Java EE中并发主题的一些相关主题:

正如已经提到的那样,你不应该这样做,但是没有一个好方法可以做到这一点。 这对我没有造成任何问题。

这种方法需要集中创建线程,并在应用程序停止时使用侦听器来终止线程。

你必须做一些事情:

  1. 将所有线程创建集中在一个类中(称之为ThreadService)。 在这里创建一个线程时,将它放在一个列表中,以便稍后循环遍历列表以阻止它们。
  2. 创建一个线程实现的接口,允许您通过相同的接口停止每个线程。 你拥有的每个线程都必须实现它自己的处理机制。 例如,如果你的Thread使用循环和Thread.sleep()然后设置stopped = true并中断线程。 循环应该检查这个并在stop = true时从循环中断。
  3. 创建一个监听器并实现ServletContextListener。 当调用contextDestroyed()时,调用ThreadService.stopThreads()。 在web.xml中注册此侦听器。

Websphere只是一个java应用程序。 它不能尊重或不尊重作为JVM或Java运行时环境特征的deamon线程。 因此,如果您在Java EE应用程序中创建deamon线程,它将在每个应用程序服务器中都是deamon。

此外,据我所知,即使您创建常规线程,它也不会阻止应用程序服务器关闭:每个应用程序服务器的关闭机制都会尝试关闭其所有组件,最后运行System.exit()以赢取犯罪分子: )手动打开线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM