原文地址:
https://dzone.com/articles/di...
BLOCKED,WAITING和TIMED_WAITING是很重要的線程狀態(tài)彭沼,但是經(jīng)常對我們造成困擾廉侧。如果需要分析線程dump必須要對其有一定的理解肖方。使用生活的例子,本文將每個狀態(tài)變成了簡單的例子非洲。
與正式的Java文檔定義相比鸭限,任何讓人費解的概念都可以用簡單的例子來理解。如果用真實生活中的例子两踏,就更好理解了败京。我想分享一些真實生活的例子來幫助理解這些線程狀態(tài)。
圖: 采用http://fastthread.io/生成的狀態(tài)圖展示了哪些線程被哪些線程阻塞
BLOCKED
Java文檔官方定義BLOCKED狀態(tài)是:“這種狀態(tài)是指一個阻塞線程在等待monitor鎖梦染∩穆螅”
真實生活例子:今天你要去面試朴皆。這是你夢想的工作,你已經(jīng)盯著它多年了泛粹。你早上起來遂铡,準備好,穿上你最好的外衣晶姊,對著鏡子打理好扒接。當你走進車庫發(fā)現(xiàn)你的老婆已經(jīng)把車開走了。在這個場景们衙,你只有一輛車钾怔,所以怎么辦?在真實生活中蒙挑,可能會打架:-)蒂教。 現(xiàn)在因為你老爸把車開走了你被BLOCKED了。你不能去參加面試脆荷。
這就是BLOCKED狀態(tài)。用技術(shù)術(shù)語講懊悯,你是線程T1蜓谋,你老婆是線程T2而鎖是車。T1被BLOCKED在鎖(例子里的車)上炭分,因為T2已經(jīng)獲取了這個鎖桃焕。
小貼士:當線程調(diào)用Object#wait()方法進入一個synchronized塊/方法或重進入一個synchronized鎖/方法時會等待獲取monitor鎖。
WAITING
Java文檔官方定義WAITING狀態(tài)是:“一個線程在等待另一個線程執(zhí)行一個動作時在這個狀態(tài)”
真實生活例子:再看下幾分鐘后你的老婆開車回家了∨趺現(xiàn)在你意識到快到面試時間了观堂,而開車過去很遠。所以你拼命地踩油門呀忧。限速120KM/H而你以160KM/H的速度在開师痕。很不幸,一個交警發(fā)現(xiàn)你超速了而账,讓你停到路邊∫确兀現(xiàn)在你進入了WAITING狀態(tài)。你聽下車坐在那等著交警過來檢查你并放行泞辐”屎幔基本上,只有等他讓你走咐吼,你被卡在WAITING狀態(tài)了吹缔。
用技術(shù)術(shù)語來講永脓,你是線程T1而交警是線程T2块请。你釋放你的鎖(例子中你停下了車)插掂,并進入WAITING狀態(tài),直到警察(例子中T2)讓你走界拦,你陷入了WAITING狀態(tài)。
小貼士:當線程調(diào)用以下方法時會進入WAITING狀態(tài):
Object#wait() 而且不加超時參數(shù)
Thread#join() 而且不加超時參數(shù)
LockSupport#park()
在對象上的線程調(diào)用了Object.wait()會進入WAITING狀態(tài)魄健,直到另一個線程在這個對象上調(diào)用了Object.notify()或Object.notifyAll()方法才能恢復妄荔。一個調(diào)用了Thread.join()的線程會進入WAITING狀態(tài)直到一個特定的線程來結(jié)束。
TIMED_WAITING
Java文檔官方定義TIMED_WAITING狀態(tài)為:“一個線程在一個特定的等待時間內(nèi)等待另一個線程完成一個動作會在這個狀態(tài)”
真實生活例子:盡管充滿戲劇性迄薄,你在面試中做的非常好琅关,驚艷了所有人并獲得了高薪工作。(祝賀你<ケ巍)你回家告訴你的鄰居你的新工作并表達你激動的心情涣易。你的朋友告訴你他也在同一個辦公樓里工作。他建議你坐他的車去上班冶伞。你想這不錯新症。所以第一天,你走到他的房子响禽。在他的房子前停好你的車徒爹。你等了10分鐘,但你的鄰居沒有出現(xiàn)芋类。你繼續(xù)開自己的車去上班隆嗅,這樣你不會在第一天就遲到。這就是TIMED_WAITING.
用技術(shù)術(shù)語來解釋侯繁,你是線程T1而你的鄰居是線程T2胖喳。你釋放了鎖(這里是停止開車)并等了足足10分鐘。如果你的鄰居T2沒有來贮竟,你繼續(xù)開車丽焊。
小貼士:調(diào)用了以下方法的線程會進入TIMED_WAITING:
Thread#sleep()
Object#wait() 并加了超時參數(shù)
Thread#join() 并加了超時參數(shù)
LockSupport#parkNanos()
LockSupport#parkUntil()
結(jié)論
當人們分析thread dump時,理解這些不同的線程狀態(tài)很關(guān)鍵咕别。
有多少線程在RUNNABLE,BLOCKED,WAITING和TIMED_WAITING狀態(tài)技健?哪一個線程被阻塞了?誰在阻塞別人惰拱?哪一個對象被鎖了凫乖?這些都是很重要的度量分析線程狀態(tài)的東西。這些線程分析的細節(jié)都可以很容易地用線上分析工具http://fastthread.io/完成弓颈。