在Java中有兩類線程:用戶線程 (User Thread)、守護(hù)線程 (Daemon Thread)。
守護(hù)線程,是運(yùn)行在后臺(tái)的一種特殊進(jìn)程。它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。比如垃圾回收線程就是一個(gè)很稱職的守護(hù)者,并且這種線程并不屬于程序中不可或缺的部分。因此,當(dāng)所有的用戶線程結(jié)束時(shí),程序也就終止了,同時(shí)會(huì)殺死進(jìn)程中的所有守護(hù)線程。反過來說,只要任何非守護(hù)線程還在運(yùn)行,程序就不會(huì)終止。
用戶線程和守護(hù)線程沒有什么區(qū)別,唯一的不同之處就在于虛擬機(jī)的離開:如果用戶線程已經(jīng)全部退出運(yùn)行了,只剩下守護(hù)線程存在了,虛擬機(jī)也就退出了。
開啟守護(hù)線程:調(diào)用Thread對(duì)象的setDaemon(true)方法來實(shí)現(xiàn),但需要注意以下幾點(diǎn):
(1) thread.setDaemon(true)必須在thread.start()之前設(shè)置開啟,否則會(huì)跑出一個(gè)IllegalThreadStateException異常。你不能把正在運(yùn)行的常規(guī)線程設(shè)置為守護(hù)線程。
(2) 在Daemon線程中產(chǎn)生的新線程也是Daemon的。
(3) 守護(hù)線程應(yīng)該永遠(yuǎn)不去訪問固有資源,如文件、數(shù)據(jù)庫,因?yàn)樗鼤?huì)在任何時(shí)候甚至在一個(gè)操作的中間發(fā)生中斷。