线程自动退出_什么是Java的守护线程?
請猜測一下上面的執行結果,如果多次執行就會發現,運行的結果會有兩種情況。第一種情況最容易出現,第二種情況在多次運行上面的程序之后偶爾會出現。
******main線程執行結束************main線程執行結束**************守護進程********這里如果不明白守護進程的真正意義就會存在疑問,為什么會出現上面的兩種情況呢?這里我根據這個例子再次解釋下文章開頭對守護線程的描述。
首先一個線程的運行肯定是由另外一個線程啟動的,在上面的例子中我們運行了“main()”方法,也就是啟動了一個主線程。然后“main()”方法中調用了我們自定義的線程“MyDaemon()”,之后我們給“MyDaemon()”這個線程設置成為了守護進程。守護進程有個特點就是當所有非守護線程都運行結束時,JVM退出,進程結束。我來畫個圖給大家解釋一下這句話的意思。
為了驗證上述的表達,我們在將之前的“MyDaemon()”進行一下修改,然后對比一下結果:
public class MyDaemon implements Runnable { @Override public void run() { while (true) { System.out.println("********守護進程********"); } }}把“MyDaemonTest()”中的守護進程設置為false。
public class MyDaemonTest { public static void main(String[] args) { Thread thread = new Thread(new MyDaemon(), "守護進程"); thread.setDaemon(false); thread.start(); System.out.println("******main線程執行結束******"); }}這個線程運行之后的執行結果是“MyDaemon()”中的內容一致循環不斷地輸出,JVM不會退出。
我們再來對比下面這個稍微改動的程序,只需要把上述的“thread.setDaemon(false)”修改成“thread.setDaemon(true)”即可:
public class MyDaemonTest { public static void main(String[] args) { Thread thread = new Thread(new MyDaemon(), "守護進程"); thread.setDaemon(true); thread.start(); System.out.println("******main線程執行結束******"); }}這次運行結果是JVM可以自動退出。
假如在主要線程運行的時候,你還想讓一個不太重要的線程執行任務,但是又想等主要線程退出時不太重要的線程也立刻結束。或許你想到了使用中斷的方式,但是如果將不太重要的線程設置為守護進程使用則更加簡單。
注意:在構建Daemon線程時,不能依靠finally塊中的內容來確保執行關閉或清理資源 的邏輯,因為它有可能沒有被執行就已經退出了。
總結
以上是生活随笔為你收集整理的线程自动退出_什么是Java的守护线程?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Slog55_lua面向对象之lua类
- 下一篇: Java——网络编程(实现基于命令行的多