并發(fā)編程(五)—— 守護(hù)線程與用戶線程

? ? ? ? Java中的線程分為兩類,守護(hù)線程(daemon)和用戶線程(user)。JVM啟動(dòng)時(shí)會(huì)調(diào)用main函數(shù),而main函數(shù)所在的線程就是一個(gè)用戶線程。同時(shí),JVM內(nèi)部還啟動(dòng)了多個(gè)守護(hù)線程,比如垃圾回收線程。

? ? ? ? 創(chuàng)建守護(hù)線程示例代碼

圖 1-1 創(chuàng)建守護(hù)線程

? ? ? ? 創(chuàng)建用戶線程示例代碼

圖 1-2 創(chuàng)建用戶線程

? ??????當(dāng)最后一個(gè)非守護(hù)線程結(jié)束時(shí),JVM會(huì)正常退出,而不管當(dāng)前是否有守護(hù)線程。即只要有一個(gè)用戶線程還沒結(jié)束,JVM就不會(huì)退出。

? ? ? ? 驗(yàn)證代碼:

圖 1-3 驗(yàn)證代碼

? ? ? ? 運(yùn)行結(jié)果:

圖 1-4 運(yùn)行結(jié)果

? ? ? ? 前面提到main函數(shù)所在的線程也是用戶線程,現(xiàn)在主線程結(jié)束了,通過(guò)jps查看發(fā)現(xiàn)JVM進(jìn)程并沒有退出,如下:

圖 1-5 jps執(zhí)行結(jié)果

? ? ? ? 這個(gè)結(jié)果說(shuō)明了,父線程(上面例子中main函數(shù)所在的線程)結(jié)束后,子線程(上面例子中的userThread)還是可以繼續(xù)執(zhí)行,即子線程的生命周期并不受父線程影響。也表明用戶線程還存在的情況下,JVM進(jìn)程不會(huì)終止。

? ? ? ? 現(xiàn)在將上面例子改為守護(hù)線程,那么結(jié)果會(huì)怎么樣呢,上代碼:

圖 1-6 驗(yàn)證代碼

? ? ? ? 運(yùn)行結(jié)果:

圖 1-7 運(yùn)行結(jié)果

? ? ? ? 同樣的,通過(guò)jps查看一下進(jìn)程情況:

圖 1-8 jps執(zhí)行結(jié)果

? ? ? ? 從運(yùn)行結(jié)果可以發(fā)現(xiàn),main函數(shù)所在的線程是唯一的用戶線程,隨著main函數(shù)所在線程運(yùn)行結(jié)束,JVM發(fā)現(xiàn)已經(jīng)沒有用戶線程了,就會(huì)終止JVM進(jìn)程,即便daemonThread守護(hù)線程的執(zhí)行體是一個(gè)死循環(huán),也不會(huì)影響這個(gè)結(jié)果。

? ? ? ? 總結(jié):如果希望在主線程結(jié)束后JVM進(jìn)程馬上結(jié)束,那么在創(chuàng)建線程時(shí)可以將其設(shè)置為守護(hù)線程,如果希望在主線程結(jié)束后子線程繼續(xù)工作,那么就將子線程設(shè)置為用戶線程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容