原文地址:
https://dzone.com/articles/di...面試
BLOCKED,WAITING和TIMED_WAITING是很重要的線程狀態,可是常常對咱們形成困擾。若是須要分析線程dump必需要對其有必定的理解。使用生活的例子,本文將每一個狀態變成了簡單的例子。微信
與正式的Java文檔定義相比,任何讓人費解的概念均可以用簡單的例子來理解。若是用真實生活中的例子,就更好理解了。我想分享一些真實生活的例子來幫助理解這些線程狀態。工具
http://fastthread.io/assets/i...spa
圖: 採用http://fastthread.io/生成的狀態圖展現了哪些線程被哪些線程阻塞.net
Java文檔官方定義BLOCKED狀態是:「這種狀態是指一個阻塞線程在等待monitor鎖。」線程
真實生活例子:今天你要去面試。這是你夢想的工做,你已經盯着它多年了。你早上起來,準備好,穿上你最好的外衣,對着鏡子打理好。當你走進車庫發現你的老婆已經把車開走了。在這個場景,你只有一輛車,因此怎麼辦?在真實生活中,可能會打架:-)。 如今由於你老爸把車開走了你被BLOCKED了。你不能去參加面試。對象
這就是BLOCKED狀態。用技術術語講,你是線程T1,你老婆是線程T2而鎖是車。T1被BLOCKED在鎖(例子裏的車)上,由於T2已經獲取了這個鎖。blog
小貼士:當線程調用Object#wait()方法進入一個synchronized塊/方法或重進入一個synchronized鎖/方法時會等待獲取monitor鎖。圖片
Java文檔官方定義WAITING狀態是:「一個線程在等待另外一個線程執行一個動做時在這個狀態」ip
真實生活例子:再看下幾分鐘後你的老婆開車回家了。如今你意識到快到面試時間了,而開車過去很遠。因此你拼命地踩油門。限速120KM/H而你以160KM/H的速度在開。很不幸,一個交警發現你超速了,讓你停到路邊。如今你進入了WAITING狀態。你聽下車坐在那等着交警過來檢查你並放行。基本上,只有等他讓你走,你被卡在WAITING狀態了。
用技術術語來說,你是線程T1而交警是線程T2。你釋放你的鎖(例子中你停下了車),並進入WAITING狀態,直到警察(例子中T2)讓你走,你陷入了WAITING狀態。
小貼士:當線程調用如下方法時會進入WAITING狀態:
Object#wait() 並且不加超時參數
Thread#join() 並且不加超時參數
LockSupport#park()
在對象上的線程調用了Object.wait()會進入WAITING狀態,直到另外一個線程在這個對象上調用了Object.notify()或Object.notifyAll()方法才能恢復。一個調用了Thread.join()的線程會進入WAITING狀態直到一個特定的線程來結束。
Java文檔官方定義TIMED_WAITING狀態爲:「一個線程在一個特定的等待時間內等待另外一個線程完成一個動做會在這個狀態」
真實生活例子:儘管充滿戲劇性,你在面試中作的很是好,驚豔了全部人並得到了高薪工做。(祝賀你!)你回家告訴你的鄰居你的新工做並表達你激動的心情。你的朋友告訴你他也在同一個辦公樓裏工做。他建議你坐他的車去上班。你想這不錯。因此第一天,你走到他的房子。在他的房子前停好你的車。你等了10分鐘,但你的鄰居沒有出現。你繼續開本身的車去上班,這樣你不會在第一天就遲到。這就是TIMED_WAITING.
用技術術語來解釋,你是線程T1而你的鄰居是線程T2。你釋放了鎖(這裏是中止開車)並等了足足10分鐘。若是你的鄰居T2沒有來,你繼續開車。
小貼士:調用瞭如下方法的線程會進入TIMED_WAITING:
Thread#sleep()
Object#wait() 並加了超時參數
Thread#join() 並加了超時參數
LockSupport#parkNanos()
LockSupport#parkUntil()
當人們分析thread dump時,理解這些不一樣的線程狀態很關鍵。
有多少線程在RUNNABLE,BLOCKED,WAITING和TIMED_WAITING狀態?哪個線程被阻塞了?誰在阻塞別人?哪個對象被鎖了?這些都是很重要的度量分析線程狀態的東西。這些線程分析的細節均可以很容易地用線上分析工具http://fastthread.io/完成。
本文來自微信公衆號「麥芽麪包」,id「darkjune_think」
轉載請註明。長按圖片識別二維碼關注。
交流Email: zhukunrong@yeah.net