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

时间:2012-02-14 09:10:11

标签: java multithreading java-ee concurrency websphere

我有一个创建了大量守护程序线程的应用程序,我希望每个应用程序关闭时关闭它们。

我有点担心Websphere 7可能没有关闭它们。

有人知道Websphere 7是否以不同方式处理Daemons线程? (我知道应该这样做)

注意: 我知道什么不应该手动创建线程,我应该使用WebSphere WorkManager或其他东西,但这个应用程序必须在Tomcat和WebSphere中运行。

我知道我应该将所有线程绑定到某个上下文/关闭机制,这正在进行中。

3 个答案:

答案 0 :(得分:4)

每个WAS服务器运行一个JVM,守护程序线程与JVM的生命周期相关联,而不是应用程序的生命周期。因此,您不应期望在应用程序停止时关闭任何守护程序线程。

正如您已经指出的那样,您不应该手动创建线程; Java EE规范禁止这样做,并且Java EE容器中的行为与您已经找到的独立Java应用程序不同。不幸的是,目前没有WorkManager等效的Java EE标准;但是,JSR-236(Java EE的并发实用程序)可能会作为候选者返回Java EE 7

与此同时,在WAS上,您可以使用asynchronous beansWorkManager)。我们已成功使用此方法将线程绑定到应用程序生命周期。

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

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

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

答案 1 :(得分:1)

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

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

你必须做一些事情:

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

答案 2 :(得分:0)

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

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