【问题标题】:Does Websphere respect Daemon threads?Websphere 是否尊重守护线程?
【发布时间】:2012-02-14 09:10:10
【问题描述】:

我有一个应用程序会创建大量守护线程,我希望在应用程序关闭时每个线程都关闭。

我有点担心 Websphere 7 可能不会将它们全部关闭。

有谁知道 Websphere 7 是否以不同的方式处理守护进程线程? (我知道应该这样做)

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

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

【问题讨论】:

  • 您是在管理线程还是通过ThreadPool 拉线程?

标签: java multithreading jakarta-ee concurrency websphere


【解决方案1】:

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

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

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

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

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

这里有一些关于 Java EE 并发主题的相关主题:

【讨论】:

    【解决方案2】:

    如前所述,您不应该这样做,但没有一个好的方法可以做到这一点。这对我来说没有任何问题。

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

    你必须做一些事情:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我认为他只是在谈论关闭一个应用程序,而不是整个容器。在这种情况下,线程不会自动终止。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多