? ? ? ? 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ù)線程示例代碼:
? ? ? ? 創(chuàng)建用戶線程示例代碼:
? ??????當(dāng)最后一個(gè)非守護(hù)線程結(jié)束時(shí)驰唬,JVM會(huì)正常退出顶岸,而不管當(dāng)前是否有守護(hù)線程。即只要有一個(gè)用戶線程還沒結(jié)束叫编,JVM就不會(huì)退出辖佣。
? ? ? ? 驗(yàn)證代碼:
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? 前面提到main函數(shù)所在的線程也是用戶線程,現(xiàn)在主線程結(jié)束了搓逾,通過jps查看發(fā)現(xiàn)JVM進(jìn)程并沒有退出卷谈,如下:
? ? ? ? 這個(gè)結(jié)果說明了,父線程(上面例子中main函數(shù)所在的線程)結(jié)束后霞篡,子線程(上面例子中的userThread)還是可以繼續(xù)執(zhí)行世蔗,即子線程的生命周期并不受父線程影響。也表明用戶線程還存在的情況下朗兵,JVM進(jìn)程不會(huì)終止污淋。
? ? ? ? 現(xiàn)在將上面例子改為守護(hù)線程,那么結(jié)果會(huì)怎么樣呢余掖,上代碼:
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? 同樣的寸爆,通過jps查看一下進(jìn)程情況:
? ? ? ? 從運(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è)置為用戶線程。