2011-04-20 102 views
1

我知道當沒有其他非守護進程線程處於活動狀態時,所有守護進程線程都應該被終止。 我正在開發從靜態對象獲取數據的小程序。這些靜態對象正在守護進程線程中從遠程服務器下載一些數據。幾個applet可以訪問相同的數據,所以對每個applet運行線程都沒有意義。 問題是我重新加載頁面時。小程序正在重新加載,並且它們在這些靜態對象中註冊,除了JVM殺死守護進程線程之外,一切都會很好。Java在applet重新加載中殺死守護進程線程

也許我一步解釋步驟:

  1. Applet是裝載和它在靜態對象,它提供數據寄存器。
  2. 靜態對象啓動守護進程線程。
  3. 頁面重新加載。
  4. 小程序正在卸載(stop()和destroy()被調用)
  5. 新的applet實例正在創建並在靜態對象中註冊。
  6. JVM在守護程序線程中拋出ThreadDeath,通信停止。

在我看來,第6步應該是在4之前和之前5. 我是否錯過了什麼?

我開發的解決方法是在註冊靜態對象之前先休眠一段時間,讓JVM殺死守護進程,然後創建自動守護進程,但這只是一種解決方法。有沒有更好的解決方案?

回答

0

爲什麼不終止守護進程線程stop()destroy()以使事情更清晰。

+0

因爲可以有另一個applet實例或其他對象等待來自服務器的數據。問題在於當守護進程被JVM殺死的時候不是爲什麼。 – BeginEnd 2011-04-20 10:04:44

0

我不會鼓勵小應用程序之間共享後臺線程,但如果你堅持,那麼你可以做到以下幾點:

您可以通過覆蓋Thread.setDefaultUncaughtExceptionHandler到一定不要錯過它捕獲ThreadDeath。 然後,您可以從該處理程序重新啓動一個新的deamon線程來替換死亡的線程。

您應該確保不要在後臺線程的共享成員上使用同步,因爲您的線程可以在同步塊的中間停止,如Thread.stop所記錄(Java插件使用Thread.stop殺死你的線程)。

請注意,如果您在2個不同的選項卡中打開了至少2個小程序,重新加載一個不會使JVM殺死您的線程。 守護程序標誌在applet環境中似乎沒有任何影響。