標籤:
本想搜下python多線程裡的setDaemon,發現了這篇文章寫得很不錯:http://blog.csdn.net/m13666368773/article/details/7245570
Thread.setDaemon的用法,經過學習以後瞭解:
1. setDaemon需要在start方法調用之前使用
2. 線程劃分為使用者線程和後台(daemon)進程,setDaemon將線程設定為後台進程
3. 如果jvm中都是後台進程,當前jvm將exit。(隨之而來的,所有的一切煙消雲散,包括後台線程啦)
4. 主線程結束後,
1) 使用者線程將會繼續運行
2) 如果沒有使用者線程,都是後台進程的話,那麼jvm結束
另外:
setDaemon方法把java的線程設定為守護線程,此方法的調用必須線上程啟動之前執行。只有在當前jvm中所有的線程都為守護線程時,jvm才會退出。
如果建立的線程沒有顯示調用此方法,這預設為使用者線程。
執行個體如下:
package com.jack.mySample;
import java.io.IOException;
public class TestThread extends Thread {
public TestThread() {
}
/** *//**
* 線程的run方法,它將和其他線程同時運行
*/
public void run(){
for(int i = 1; i <= 100; i++){
try{
Thread.sleep(100);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println(i);
}
}
public static void main(String [] args){
TestThread test = new TestThread();
// 如果不設定daemon,那麼線程將輸出100後才結束
test.setDaemon(true);
test.start();
System.out.println("isDaemon = " + test.isDaemon());
try {
System.in.read(); // 接受輸入,使程式在此停頓,一旦接收到使用者輸入,main線程結束,守護線程自動結束
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
補充說明:
定義:守護線程--也稱“服務線程”,在沒有使用者線程可服務時會自動離開。
優先順序:守護線程的優先順序比較低,用於為系統中的其它對象和線程提供服務。
設定:通過setDaemon(true)來設定線程為“守護線程”;將一個使用者線程設定為
守護線程的方式是在 線程對象建立 之前 用線程對象的setDaemon方法。
example: 記憶體回收線程就是一個經典的守護線程,當我們的程式中不再有任何啟動並執行
Thread,程式就不會再產生垃圾,記憶體回收行程也就無事可做,所以當記憶體回收線程是
JVM上僅剩的線程時,記憶體回收線程會自動離開。它始終在低層級的狀態中運行,用於
即時監控和管理系統中的可回收資源。
生命週期:守護進程(Daemon)是運行在背景一種特殊進程。它獨立於控制終端並且
周期性地執行某種任務或等待處理某些發生的事件。也就是
說守護線程不依賴於終端,但是依賴於系統,與系統“同生共死”。那Java的守護線程是
什麼樣子的呢。當JVM中所有的線程都是守護線程的時候,JVM就可以退出了;如果還有一個
或以上的非守護線程則JVM不會退出。
初次碰到這個方法,就被這個怪裡怪氣的拼字單詞懵了下,查API又覺得理解得不深刻,那還是查下Daemon這個詞有什麼意思,什麼詞源吧。Daemon 中的 ae 為一個音,重音在 /di:/ 上,好象是指希臘守護神的意思吧。在電腦專業英語中是守護線程的意思。原以為如果一個線程被光榮地定義為守護線程,一定會直到進程運行到最後一刻,但真錯了,如果一個線程是守護線程,那麼,主線程運行結束時,如果沒有任何非守護線程在運行,守護線程就會自盡了。 setDaemon方法是Thread中的方法,預設為false狀態,將該線程標記為守護線程或使用者線程,該方法必須在啟動線程前調用,具有最低的優先順序,讓系統資源優先調用其他線程。當正在啟動並執行線程都是守護線程時,JAVA 虛擬機器退出。
如下邊這個小程式如示:
import java.io.IOException;
class TestMain4 extends Thread {
public void run() { //永真迴圈線程
for(int i=0;;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException ex) { }
System.out.println(i);
}
}
public static void main(String [] args){
TestMain4 test = new TestMain4();
test.setDaemon(true); //調試時可以設定為false,那麼這個程式是個死迴圈,沒有允出準則。設定為true,即可主線程結束,test線程也結束。
test.start();
System.out.println("isDaemon = " + test.isDaemon());
try {
System.in.read(); // 接受輸入,使程式在此停頓,一旦接收到使用者輸入,main線程結束,守護線程自動結束
} catch (IOException ex) {}
}
}
(轉)Thread.setDaemon設定說明