簡體   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