2011-12-30 175 views
2

大家好,守護進程線程會在封閉線程結束時停止工作嗎?或者當「主」線程完成時守護線程會停止?java守護進程線程

我在jre6上測試了這個例子,結果是daemon thread stopped working when the enclosing it thread finished。請注意,java文檔表示守護進程線程在沒有其他應用程序線程保留時被終止。並不是說守護線程在父非守護線程保持不變時被殺死。

請給我答案。請寄給我關於這個問題的任何材料。 對不起,我的英文。

public class Main { 
    public static void main(String[] args) { 
     Thread simple = new Thread(new SimpleTask()); 
     simple.start(); 
    } 
} 

class SimpleTask implements Runnable { 
    public void run() { 
     try { 
      Thread daemon = new Thread(new DaemonTask()); 
      daemon.setDaemon(true); 
      daemon.start(); 
      Thread.sleep(5000); 
     } catch (InterruptedException e) {} 
    }; 
} 

class DaemonTask implements Runnable { 
    public void run() { 
     int i = 0; 
     while (true) { 
      try { 
       System.out.println("a" + (i++)); 
       Thread.sleep(500); 
      } catch (InterruptedException e) {} 
     } 
    } 
} 

回答

11

將守護線程停止時,封閉它的線程將完成的工作?

在Java中沒有「封閉線程」這樣的概念。有線程但它們很少使用。

守護進程線程只是線程,不會阻止JVM終止。當沒有任何非守護線程離開時,JVM將終止。如果仍有一些非守護進程線程正在執行,那麼JVM將繼續運行,包括任何守護進程線程 - 無論這些守護進程線程是否已完成啓動的線程。

+1

現貨!關鍵是「當沒有任何非守護進程線程時,JVM將終止」 – Manish 2011-12-30 09:24:28

+0

Jon Skeet說的是正確的。在您的示例中,當您的SimpleTask終止時,守護線程將停止。原因是您的主線程在SimpleTask終止之前停止。所以,當SimpleTask被終止,這是最後一個非惡魔線程,因此你的守護線程也停止 – 2011-12-30 09:26:57

1

由於主線程一旦啓動簡單線程就結束,簡單線程就是最後一個應用線程完成,所以守護線程在線程結束時結束。

簡單的線程是啓動守護進程線程的事實與此無關。

1

守護進程線程停止工作,因爲沒有任何非守護進程線程離開,而不是因爲父線程完成。

3

大家好,請問守護線程停止工作時,它的線程 將完成?或者當主「主線程」 完成時守護線程將停止?

當主執行線程和所有用戶線程終止它們的執行時,守護線程將被JVM停止。 然後,守護進程線程嚴格依賴於用戶線程和程序主線程的執行。

相反,JVM會關閉你的程序,直到所有的用戶線程都被終止。

作爲回顧,用戶線程是保持一個程序從退出一個線程,因爲,即使你的程序的主線程終止時,JVM不會直到所有的用戶線程完成中斷程序要求的工作。只有所有用戶線程都終止時,JVM才能關閉程序。

然後,守護進程線程是一個線程,不會阻止程序退出。 有關其他信息,請檢查this SO的舊問題。

檢查Thread APIsetDaemon()方法報告的文檔如下:

將此線程標記爲守護進程線程或用戶線程。當運行的唯一線程全部爲守護進程 線程時,Java虛擬機退出。

還是Runtime API

1)程序正常退出,最後的非守護線程退出時:

Java虛擬機響應2種 事件關閉或 當退出(等同於System.exit)方法被調用時,或者

2)虛擬機終止以響應用戶中斷, 如打字^​​ C或全系統事件(例如用戶註銷或系統關閉)。

+0

@Downvoter你能解釋一下downvote的原因嗎? – 2015-11-27 08:50:54