守護執行緒簡介
阿新 • • 發佈:2018-11-08
xl_echo編輯整理,歡迎轉載,轉載請宣告文章來源。更多IT、程式設計案例、資料請聯絡QQ:1280023003,加群298140694。百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!!
什麼是守護執行緒?
守護程序(Daemon)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。
案例解析
1、 public static void main(String[] args) throws InterruptedException {
2、 //main執行緒開始
3、 Thread thread = new Thread(() ->{//自定義一個新的執行緒
4、 while (true){
try{
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
}
});
5、// thread.setDaemon(true);//將thread設定為守護執行緒
6、 thread.start();//啟動thread執行緒
7、 Thread.sleep(1000L);
8、 System.out.println("main執行緒結束" );
//main執行緒技術
}
不註釋第5行,分析執行結果
- 當以上程式從main執行緒開始的時候,執行到第3行,我們新建立的執行緒得到建立。
- 建立完成之後,新的執行緒處於new Thread階段,這個階段while迴圈是不會執行的。
- 當我們第5部是註釋的時候,我們的main執行緒就直接執行了thread.start();新執行緒進入就緒狀態,等待CPU分配資源。依舊沒有執行,但是當我們要繼續往下執行的時候,沒有特殊情況下,while迴圈肯定會被執行。
- while迴圈執行起來之後,我們整個main執行緒一直處於阻塞狀態。我們新建的執行緒一直被執行
註釋第5行,分析執行結果
- 當我們將第5部開啟之後,我們在執行main執行緒,結果完全不一樣了。
- 前3散步和上面的分析一樣但是執行到第5不之後,我們新的執行緒成為守護執行緒,開始執行第4部。
- 當第四步執行之後,同時間內,main方法不會阻塞,會繼續執行第6、7部。
- 當第7部的休眠結束之後,main執行第8步,執行緒結束。
- 但是這個時候我們再觀察程式,我們的while迴圈案例說是死迴圈,這條執行緒應該是不會結束的,它應該影響我們的程式,不讓程式結束,但是最後結果是,都已經結束了。並且沒有jvm退出了。
那麼這個時候問題來了。
為什麼與我們想象中的不一樣,不是應該不管怎麼執行什麼我們的jvm虛擬機器都會一直執行嗎?
原因可以來分析一下守護執行緒的作用。
從上面我們可以看出,如果JVM中都是守護執行緒,那麼我們的JVM會正常退出。
這裡我們就可以看到守護執行緒的一個作用: