java中什么是守护线程_什么是Java的守护线程?
歡迎大家搜索“小猴子的技術筆記”關注我的公眾號,有問題可以及時和我交流。
守護線程是一種支持性線程,主要用于后臺調度以及支持性的工作。守護線程具備自動結束生命周期的特性,而非守護線程則不具備。 ????如果對上面的概念一知半解的話,我們先來看一個簡單的例子,明白守護線程的執行情況:
public class MyDaemon implements Runnable {
@Override
public void run() {
System.out.println("********守護線程********");
}
}
public class MyDaemonTest {
public static void main(String[] args) {
Thread thread = new Thread(new MyDaemon(), "守護線程");
thread.setDaemon(true);
thread.start();
System.out.println("******main線程執行結束******");
}
}
請猜測一下上面的執行結果,如果多次執行就會發現,運行的結果會有兩種情況。第一種情況最容易出現,第二種情況在多次運行上面的程序之后偶爾會出現。
******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中什么是守护线程_什么是Java的守护线程?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythonexpect后怎么循环_py
- 下一篇: java 的 非短路_Java 短路运算