![](/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.