Java并发编程(4):守护线程与线程阻塞的四种情况
守護(hù)線程
??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)闆](méi)有如果沒(méi)有了被守護(hù)這,也就沒(méi)有繼續(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)需要注意:
1、setDaemon(true)必須在調(diào)用線程的start()方法之前設(shè)置,否則會(huì)跑出IllegalThreadStateException異常。
2、在守護(hù)線程中產(chǎn)生的新線程也是守護(hù)線程。
3、 不要認(rèn)為所有的應(yīng)用都可以分配給守護(hù)線程來(lái)進(jìn)行服務(wù),比如讀寫操作或者計(jì)算邏輯。
線程阻塞
線程可以阻塞于四種狀態(tài):
1、當(dāng)線程執(zhí)行Thread.sleep()時(shí),它一直阻塞到指定的毫秒時(shí)間之后,或者阻塞被另一個(gè)線程打斷;
2、當(dāng)線程碰到一條wait()語(yǔ)句時(shí),它會(huì)一直阻塞到接到通知(notify())、被中斷或經(jīng)過(guò)了指定毫秒時(shí)間為止(若制定了超時(shí)值的話)
3、線程阻塞與不同I/O的方式有多種。常見(jiàn)的一種方式是InputStream的read()方法,該方法一直阻塞到從流中讀取一個(gè)字節(jié)的數(shù)據(jù)為止,它可以無(wú)限阻塞,因此不能指定超時(shí)時(shí)間;
4、線程也可以阻塞等待獲取某個(gè)對(duì)象鎖的排他性訪問(wèn)權(quán)限(即等待獲得synchronized語(yǔ)句必須的鎖時(shí)阻塞)。
注意,并非所有的阻塞狀態(tài)都是可中斷的,以上阻塞狀態(tài)的前兩種可以被中斷,后兩種不會(huì)對(duì)中斷做出反應(yīng)
from:?http://www.importnew.com/20551.html
原文出處:?蘭亭風(fēng)雨
總結(jié)
以上是生活随笔為你收集整理的Java并发编程(4):守护线程与线程阻塞的四种情况的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java并发编程(3):线程挂起、恢复与
- 下一篇: Java并发编程(5):volatile