java中精靈線程(Daemon)或守護(hù)線程和普通線程有什么區(qū)別
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號: 73203。
精靈線程(Daemon)或守護(hù)線程:
馬克-to-win:Daemon英文意思是希臘神話中半人半神的精靈,守護(hù)神。在java中,"精靈守護(hù)Daemon線程"就是運(yùn)行在程序后臺的線程,一般被用于在后臺為其它線程提供服務(wù)。既然它在后臺運(yùn)行,當(dāng)前臺線程(前幾節(jié)學(xué)習(xí)的線程)運(yùn)行完,主體程序就結(jié)束了,理所當(dāng)然該后臺線程也應(yīng)該隨之結(jié)束了。相對來講,前面幾節(jié)我們講的線程是"用戶線程",這兩種線程技術(shù)上來講有什么分別呢?java官方文檔中大致這樣描述:The Java Virtual Machine continues to execute threads until All threads that are not daemon threads have died。這句話的含義就是:用戶線程不完,jvm系統(tǒng)就不完,要是想只運(yùn)行"精靈Daemon線程",對不起jvm不給面子,不伺候,就關(guān)閉了,不給"精靈 Daemon線程"們單獨(dú)運(yùn)行的機(jī)會。這句話比較難理解,我換一句話來說這件事。當(dāng)一個(gè)應(yīng)用程序的所有非精靈線程停止運(yùn)行時(shí),即使仍有精靈線程還在運(yùn)行,該應(yīng)用程序也將終止,反過來,只要還有非精靈線程在運(yùn)行,應(yīng)用程序就不會停止。我們可以通過setDaemon(boolean on)來設(shè)置某線程為精靈線程。用isDaemon()來判斷某線程是否為精靈線程或守護(hù)線程。注意:要想設(shè)置一個(gè)線程為精靈守護(hù)線程, setDaemon必須在start前調(diào)用。
例:1.7.1_1-本章源碼
class ThreadMark_to_win extends Thread {
public void run(){
for(int i = 1; i <= 15;i++){
try{
Thread.sleep(100);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println("子線程 "+i);
}
}
}
public class Test extends Thread{
public static void main(String [] args){
ThreadMark_to_win tm = new ThreadMark_to_win();
tm.setDaemon(true);
tm.start();
System.out.println("子線程是精靈線程嗎?" +tm.isDaemon());
try{
Thread.sleep(1000);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已經(jīng)結(jié)束");
}
}
輸出結(jié)果:
子線程是精靈線程嗎?true
子線程 1
子線程 2
子線程 3
子線程 4
子線程 5
子線程 6
子線程 7
子線程 8
子線程 9
main已經(jīng)結(jié)束
子線程 10
后續(xù):馬克-to-win:注意上面主線程一結(jié)束,精靈線程立刻玩兒完。相對來講,我們看一個(gè)非精靈線程的對等例子。
例:1.7.1_2-本章源碼
class ThreadMark_to_win extends Thread {
public void run(){
for(int i = 1; i <= 15;i++){
try{
Thread.sleep(100);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println("子線程 "+i);
}
}
}
public class Test extends Thread{
public static void main(String [] args){
ThreadMark_to_win tm = new ThreadMark_to_win();
// tm.setDaemon(true);
tm.start();
System.out.println("子線程是精靈線程嗎?" +tm.isDaemon());
try{
Thread.sleep(1000);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已經(jīng)結(jié)束");
}
}
輸出結(jié)果:
子線程是精靈線程嗎?false
子線程 1
子線程 2
子線程 3
子線程 4
子線程 5
子線程 6
子線程 7
子線程 8
子線程 9
main已經(jīng)結(jié)束
子線程 10
子線程 11
子線程 12
子線程 13
子線程 14
子線程 15