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