java中精靈線程(Daemon)或守護(hù)線程和普通線程有什么區(qū)別
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
精靈線程(Daemon)或守護(hù)線程:
馬克-to-win:Daemon英文意思是希臘神話中半人半神的精靈,守護(hù)神。在java中,"精靈守護(hù)Daemon線程"就是運(yùn)行在程序后臺(tái)的線程,一般被用于在后臺(tái)為其它線程提供服務(wù)。既然它在后臺(tái)運(yùn)行,當(dāng)前臺(tái)線程(前幾節(jié)學(xué)習(xí)的線程)運(yùn)行完,主體程序就結(jié)束了,理所當(dāng)然該后臺(tái)線程也應(yīng)該隨之結(jié)束了。相對(duì)來(lái)講,前面幾節(jié)我們講的線程是"用戶(hù)線程",這兩種線程技術(shù)上來(lái)講有什么分別呢?java官方文檔中大致這樣描述:The Java Virtual Machine continues to execute threads until All threads that are not daemon threads have died。這句話的含義就是:用戶(hù)線程不完,jvm系統(tǒng)就不完,要是想只運(yùn)行"精靈Daemon線程",對(duì)不起jvm不給面子,不伺候,就關(guān)閉了,不給"精靈 Daemon線程"們單獨(dú)運(yùn)行的機(jī)會(huì)。這句話比較難理解,我換一句話來(lái)說(shuō)這件事。當(dāng)一個(gè)應(yīng)用程序的所有非精靈線程停止運(yùn)行時(shí),即使仍有精靈線程還在運(yùn)行,該應(yīng)用程序也將終止,反過(guò)來(lái),只要還有非精靈線程在運(yùn)行,應(yīng)用程序就不會(huì)停止。我們可以通過(guò)setDaemon(boolean on)來(lái)設(shè)置某線程為精靈線程。用isDaemon()來(lái)判斷某線程是否為精靈線程或守護(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é)束,精靈線程立刻玩兒完。相對(duì)來(lái)講,我們看一個(gè)非精靈線程的對(duì)等例子。
例: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