【多線程】守護線程 Daemon
守護線程 Daemon
- 線程分為用戶線程和守護線程
- 虛擬機必須確保用戶線程執行完畢
- 虛擬機不用等待守護線程執行完畢
- 如,后臺記錄操作日志,監控內存,垃圾回收等待..
代碼示例:
/**
* @Description 測試守護線程,上帝保佑著你
* @Author hzx
* @Date 2022-03-27
*/
public class TestDaemon {
public static void main(String[] args) {
TestGod god = new TestGod();
TestYou you = new TestYou();
Thread thread = new Thread(god);
thread.setDaemon(true); //默認是false,表示是用戶線程,正常的線程都是用戶線程...
thread.start(); //守護線程啟動
new Thread(you).start(); //你,用戶線程啟動
}
}
class TestGod implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("上帝保佑著你");
}
}
}
class TestYou implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("你開心的活了"+i+"個紀元");
}
System.out.println("===========Goodbye!World!===========");
}
}
執行結果:
上帝保佑著你
你開心的活了0個紀元
上帝保佑著你
你開心的活了1個紀元
上帝保佑著你
你開心的活了2個紀元
上帝保佑著你
你開心的活了3個紀元
上帝保佑著你
你開心的活了4個紀元
你開心的活了5個紀元
上帝保佑著你
你開心的活了6個紀元
上帝保佑著你
上帝保佑著你
你開心的活了7個紀元
上帝保佑著你
你開心的活了8個紀元
你開心的活了9個紀元
===========Goodbye!World!===========
上帝保佑著你
- 一個守護線程什么時候結束不取決于主線程什么時候結束。守護線程的作用是在后臺運行任務,只要還有一個以上非守護線程沒有結束(即便此時主線程已結束),程序就不會結束。
- 反過來,當所有非守護線程都結束了后,即便還有未結束的守護線程,系統也會馬上結束這些守護線程,然后結束程序。
思考問題:當非守護線程執行結束的時候,為什么守護線程還會再接著執行一會兒再結束?
解釋:單一線程當然是主程序語句結束,主程序結束,多線程是并行狀態,主線程語句執行結束,其他線程執行時間可能大于主線程執行時間,所以主線程并沒有關閉,等其他線程結束的收尾工作,結束線程也需要時間。

浙公網安備 33010602011771號