Java中線程分為兩種類型:用戶線程和守護(服務(wù))線程。通過Thread.setDaemon(false)設(shè)置為用戶線程;通過Thread.setDaemon(true)設(shè)置為守護線程;不設(shè)置則默認為用戶線程。
結(jié)束單線程用 Thread.interrupt() 方法,多線程結(jié)束則需要設(shè)置守護線程。當(dāng)不存在用戶線程時,守護線程就會全部終結(jié)(可以理解為:守護線程是服務(wù)線程,用戶線程是被服務(wù)線程,用戶線程(被服務(wù)線程)全都沒有了,服務(wù)線程便沒有存在意義而自動終結(jié))
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
class StopThread implements Runnable { public void run() { // 構(gòu)造函數(shù),實例化時默認執(zhí)行 while ( true ) { // 永真循環(huán),用于檢測該守護線程會不會自動結(jié)束 System.out.println(Thread.currentThread().getName() + "....run" ); } } } public class threadTest { public static void main(String[] args) { StopThread st = new StopThread(); Thread t1 = new Thread(st); // 創(chuàng)建新線程 Thread t2 = new Thread(st); t1.setDaemon( true ); // 設(shè)置成守護(服務(wù))線程,當(dāng)用戶線程全掛時,所有守護線程也跟著掛 t2.setDaemon( true ); t1.start(); // 線程開始 t2.start(); int num = 0 ; while ( true ) { if (num++ == 10 ) { break ; } System.out.println(Thread.currentThread().getName() + "......." + num); } System.out.println( "over" ); } } |
當(dāng)執(zhí)行完最后一句 System.out.println(“over”) 時,用戶線程(主程序)結(jié)束;在后臺永真循環(huán)里 不斷輸出信息的兩個守護線程 也會自動終止。
另外介紹一個常見的問題:Java里面 所有非守護線程結(jié)束后,所有的守護線程自動退出這句話對嗎?
參考答案:
守護線程的唯一作用是為其他線程提供服務(wù).當(dāng)只剩下守護線程時,虛擬機就退出了”(出自:java核心技術(shù)),現(xiàn)在非守護的沒有了,也就不需要守護來提供服務(wù)了。
總結(jié)
以上就是本文關(guān)于Java語言多線程終止中的守護線程實例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://blog.csdn.net/never_tears/article/details/62445565