Java 中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護(hù)線程)
用戶線程即運(yùn)行在前臺(tái)的線程,而守護(hù)線程是運(yùn)行在后臺(tái)的線程。 守護(hù)線程作用是為其他前臺(tái)線程的運(yùn)行提供便利服務(wù),而且僅在普通、非守護(hù)線程仍然運(yùn)行時(shí)才需要,比如垃圾回收線程就是一個(gè)守護(hù)線程。當(dāng) VM 檢測(cè)僅剩一個(gè)守護(hù)線程,而用戶線程都已經(jīng)退出運(yùn)行時(shí),VM就會(huì)退出,因?yàn)闆]有如果沒有了被守護(hù)這,也就沒有繼續(xù)運(yùn)行程序的必要了。如果有非守護(hù)線程仍然存活,VM 就不會(huì)退出。
守護(hù)線程并非只有虛擬機(jī)內(nèi)部提供,用戶在編寫程序時(shí)也可以自己設(shè)置守護(hù)線程。用戶可以用 Thread 的 setDaemon(true)方法設(shè)置當(dāng)前線程為守護(hù)線程。
雖然守護(hù)線程可能非常有用,但必須小心確保其他所有非守護(hù)線程消亡時(shí),不會(huì)由于它的終止而產(chǎn)生任何危害。因?yàn)槟悴豢赡苤涝谒械挠脩艟€程退出運(yùn)行前,守護(hù)線程是否已經(jīng)完成了預(yù)期的服務(wù)任務(wù)。一旦所有的用戶線程退出了,虛擬機(jī)也就退出運(yùn)行了。 因此,不要在守護(hù)線程中執(zhí)行業(yè)務(wù)邏輯操作(比如對(duì)數(shù)據(jù)的讀寫等)。
另外有幾點(diǎn)需要注意:
線程可以阻塞于四種狀態(tài):
注意,并非所有的阻塞狀態(tài)都是可中斷的,以上阻塞狀態(tài)的前兩種可以被中斷,后兩種不會(huì)對(duì)中斷做出反應(yīng)