2012-06-07 51 views
1

我在Weblogic server (WLS)內啓動了一個Java線程池ThreadPoolExecutor(具有核心池大小)。要正常關閉池,我需要在該池上調用shutdown()。但由於我無法控制的原因,我無法在此WLS中添加任何應用程序生命週期偵聽器,這意味着我沒有任何關閉鉤子來調用此方法。 所以我正在考慮將池中的線程作爲守護進程線程,以便WLS JVM不會等待這些線程在關閉時完成。否則JVM將不會正常關閉,因爲池中的核心線程始終在運行。將java線程池中的線程作爲守護程序線程是否存在任何問題

將線程池中的線程作爲守護進程存在任何缺點。我瞭解守護線程,當JVM退出時,這些線程永遠不會被正常清理,任何正在運行的東西都不會正常完成。這個問題只在關機階段。

在線程池中創建線程守護進程還有其他問題嗎? (或更好的方法)

+0

相關守護進程線程的問題會涉及到什麼這些線程實際上做。只有你知道這些線程執行什麼任務。 –

+0

[關於守護線程利弊的一些想法](http://stackoverflow.com/search?tab=relevance&q= [java]%20why%20use%20daemon%20threads) – assylias

+0

你看了[工作經理]( http://docs.oracle.com/cd/E15051_01/wls/docs103/config_wls/self_tuned.html) – mprabhat

回答

1

鑑於您處於應用程序容器中,您可能希望將工作管理器用作@mprabhat的建議。但是如果你確實需要受你控制的線程,你仍然可以關閉它們。 WebLogic通過關閉掛鉤實現應用程序生命週期通知。而且這種機制仍然適用於您。您可以使用Runtime.addShutdownHook註冊一個。不要忘記,要儘快完成你的工作。的WebLogic有超時,所以關閉順序基本上是:

  1. 關斷請求(通過System.exit()的或發送到JVM處理的信號)。
  2. 執行關閉掛鉤和WebLogic的關閉掛鉤。
  3. 經過一段時間(5-10秒,我想)WebLogic的關閉鉤子之一調用System.halt()。
  4. 不管關閉鉤子是否完成,JVM都會終止。