千言萬語抵不過一張圖...
JAVA代碼中線程共有6種狀態(tài)除,RUNNING
是為了表示線程正在執(zhí)行單獨(dú)增加的一個(gè)邏輯狀態(tài)躲查,實(shí)際并沒有危虱。
重點(diǎn)關(guān)注的四種狀態(tài):RUNNABLE玖翅、BLOCKED铅辞、WAITING和TIME_WAITING厌漂,使用jstack打印的線程堆棧中時(shí)常會(huì)出現(xiàn)以上狀態(tài)。
-
BLOCKED
: 線程在等待獲取鎖進(jìn)入同步塊或者同步方法中斟珊。兩個(gè)死鎖的線程即是Blocked。 -
WAITING
: 比BLOCKED狀態(tài)進(jìn)步一些富纸,指我已經(jīng)獲得鎖了囤踩,但由于有些條件不滿足,我自己等會(huì)晓褪,調(diào)用object.wait()方法堵漱。等條件滿足了,別的線程調(diào)用notify再叫我涣仿。另外也可以調(diào)用Thread.join()方法勤庐,顧名思義就是調(diào)用別的線程的join方法,讓別人join進(jìn)來先執(zhí)行好港,那我就只能等會(huì)了愉镰。但是由于wait()和notify()以及notifyAll()用于協(xié)調(diào)對(duì)共享資源的存取,所以必須在synchronized塊中使用钧汹。所以即便wait狀態(tài)的線程被notfiy喚醒了丈探,也需要再次獲得鎖,所以喚醒后進(jìn)入Blocked狀態(tài)拔莱。 -
TIMED_WAITING
:類比WAITING碗降,差異是不需要notify()或者notifyAlL()方法喚醒隘竭,時(shí)間到了我自己醒了。另外sleep比較好理解讼渊,就是讓當(dāng)前線程睡一會(huì)动看,與wait的區(qū)別是它不釋放鎖。 -
RUNNABLE
: 在JAVA虛擬機(jī)中已經(jīng)在運(yùn)行爪幻,但是在等待操作系統(tǒng)資源菱皆,比如CPU時(shí)間片。