簡體   English   中英

所有線程死亡后停止應用程序

[英]Stopping application when all threads are died

在我的Java應用程序中,我有很多線程,但是有幾個最重要的線程,它們執行復雜的計算(訪問遠程數據庫等)。

萬一所有這些重要的線程都died ,那么我需要退出應用程序,即使是次要的線程仍在運行。

我實現了一個附加的(線程)類來監視具有此類核心功能的這些線程:

   boolean allThreadsDied;
   do {
      allThreadsDied = true;
      for (Thread oneThread : threadsList) {
         allThreadsDied = allThreadsDied & (!oneThread.isAlive());
      }
   } while (!allThreadsDied);

   // now, it's time to quit the application

該線程永久運行,並檢查重要線程的狀態。

我想我已經發明了自行車 ,而且效率很低。 因為此線程永久運行,即使沒有當前計算,也會產生很高的處理器負載。

我的問題如下:有沒有更有效的方法來監視一組線程並在所有這些線程都消亡時獲得信號?

將所有不重要的線程標記為daemon線程(請參閱: Thread.setDaemon() ),然后正常啟動所有重要線程。

一旦所有非守護程序線程都死機/完成,JVM將自動退出。

像這樣使用Thread.join

for (Thread t : threadsList) {
    t.join();
}

假設您將此代碼放在main方法的末尾。 調用t.join()將使主線程等待,直到線程t死掉為止。

將整個內容更改為:

for (Thread oneThread : threadsList) {
   try {
      oneThread.join();
   } catch (InterruptedException ie) {
      // handle this
   }
}

這將等待每個線程完成處理,但不會浪費CPU周期。 (運行此線程的線程將在join期間進入睡眠狀態。)

創建線程時,可以指定它是否為“守護程序”線程。 main()返回時,如果有任何非守護程序線程在運行,則應用程序將繼續運行,但是如果僅保留守護程序線程,則它將不會繼續運行。 當您生成不重要的線程時,可以將它們作為守護程序線程生成,這可以實現您想要的功能。

這可能是您問題的答案:可以將線程標記為守護程序。 守護程序線程不會阻止JVM關閉。 因此,在您的情況下,請使用thread.setDaemon(true)方法將工作線程保持“原樣”,並將次要的線程保持為守護進程。

通常,應用程序會自動退出。 隨你:

System.exit(0); // forces the app to exit.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM