From Gossip@Openhome

Java Gossip: Daemon 執行緒

您想要設計一個程式,除了主執行緒之外,其運用了一個執行緒於背景進行相關運算工作,您的程式可能像是這樣:
  • SimpleThread.java
package onlyfun.caterpillar;

public class SimpleThread {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
while(true) {
System.out.print("T");
}
}
});

thread.start();

// 主執行緒繼續進行其它工作........

// such...such....

// 現在主執行緒執行到這邊了,工作應該結束了
}
}

您的執行緒已經運行到最後一個陳述了,這時應該是工作結束的時候,但您的另一個執行緒還在運作,您怎麼停止它?在最後加上一行使用System.exit ()?這雖然也可以,但這只是強迫程式結束,而且這個方法並不是隨時可以適用!

一個Daemon執行緒是一個在背景執行服務的執行緒,例如網路伺服器傾聽連接埠的服務、隱藏的系統執行緒如垃圾收集執行緒或其它JVM 建立的執行緒,如果所有的非Daemon的執行緒都結束了,則Daemon執行緒自動就會終止。

從Main函式開始的是一個非Daemon執行緒,如果您希望某個執行緒在非Daemon執行緒都結束後也跟著終止,那麼您要將它設定為Daemon執行 緒,下面這個程式是個簡單的示範:

  • DaemonTest.java
package onlyfun.caterpillar;

public class DaemonTest {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
while(true) {
System.out.print("T");
}
}
});
thread.setDaemon(true);
thread.start();
}
}

這個程式在主執行緒結束之後,Daemon也就跟著結束了,所以它不會像上面這個程式,不斷的列印T字元;您可以使用setDaemon()方法來設定一 個執行緒是否為Daemon執行緒,使用isDaemon()方法則可以判斷該執行緒是否為Daemon執行緒。

基本上,Java預設所有從Daemon執行緒產生的執行緒也是Daemon執行緒,這很直覺,由一個背景服務執行緒衍生出來的執行緒,也應該是為了在背 景服務而產生的,所以在該停止時也應該停止。