摘要:線程可以處于以下狀態之一尚未啟動的線程處于此狀態。被阻塞等待監視器鎖定的線程處于此狀態。無限期等待另一個線程執行特定操作的線程處于此狀態。已退出的線程處于此狀態。調用的線程處于狀態,以使指定的線程終止。
Java Thread 可能處在以下幾種狀態
Java Doc 里通過一個枚舉類型 Enum
線程可以處于以下狀態之一:
NEW 尚未啟動的線程處于此狀態。
RUNNABLE 在Java虛擬機中執行的線程處于此狀態。
BLOCKED 被阻塞等待監視器鎖定的線程處于此狀態。
WAITING 無限期等待另一個線程執行特定操作的線程處于此狀態。
TIMED_WAITING 正在等待另一個線程執行最多指定等待時間的操作的線程處于此狀態。
TERMINATED 已退出的線程處于此狀態。
線程在給定時間點只能處于一種狀態。這些狀態是虛擬機狀態,不反映任何操作系統線程狀態。
通過示例而不是Java doc中給出的正式定義,可以很容易地理解任何令人困惑的概念。如果它們是現實生活中的例子,它可能更具有相關性。我想分享一些可能有助于理解這些線程狀態的現實例子。
由 http://fastthread.io 生成的傳遞圖,顯示哪些線程阻塞了哪些線程
BLOCKED 阻塞Java doc正式將BLOCKED狀態定義為:“阻塞等待監視器鎖的線程處于此狀態。”
現實生活中的例子:今天你要去面試。這是您夢寐以求的工作,這是您過去幾年一直瞄準的目標。你早上醒來,準備好了,穿上你最好的衣服,在鏡子前面看起來很敏銳。現在你走出你的車庫,意識到你的妻子已經開車了。在這種情況下,你只有一輛車,那么會發生什么?在現實生活中,可能會發生斗爭:-)。在這里你被阻止,因為你的妻子已經開車了。你將無法參加面試。
這是BLOCKED狀態。用技術術語解釋它,你是線程T1,你的妻子是線程T2,鎖是汽車。T1在鎖(即汽車)上被阻擋,因為T2已經獲得了這個鎖。
提示:線程在等待監視器鎖進入同步塊/方法或在調用Object#wait()方法后重新輸入同步塊/方法時,將進入BLOCKED狀態。
WAITING 等候Java doc正式將WAITING狀態定義為:“無限期等待另一個線程執行特定操作的線程處于此狀態。”
現實生活中的例子:讓我們說幾分鐘后你的妻子帶著車回家了。現在你意識到面試的時間已經到了,而且到達那里還有很長的路要走。因此,您將所有動力都放在汽車的油門踏板上。當允許的速度限制僅為60英里/小時時,您以100英里/小時的速度行駛。你不走運,交通警察看到你超過限速,他把你拉到路邊。現在你進入WAITING狀態,我的朋友。你停止開車,坐在車里閑逛,直到警察調查你,然后讓你走。基本上,在他讓你離開之前,你會陷入等待狀態。
用技術術語解釋它,你是線程T1,警察是線程T2。你釋放鎖(即你停止開車),然后進入等待狀態。直到警察(即T2)讓你離開,你將陷入這種等待狀態。
提示:線程在調用以下方法之一時將進入WAITING狀態:
Object#wait() 未指定超時時間
Thread#join() 未指定超時時間
LockSupport#park()
在對象上調用Object.wait()的線程處于WAITING狀態,直到另一個線程調用該對象上的Object.notify()或Object.notifyAll()。調用Thread.join()的線程處于WAITING狀態,以使指定的線程終止。
TIMED_WAITING 指定時間的等待Java doc正式將TIMED_WAITING狀態定義為:“等待另一個線程在指定的等待時間內執行操作的線程處于此狀態。”
現實生活中的例子: 盡管所有的戲劇性,你在采訪中表現得非常好,給每個人留下了深刻的印象并得到了這份高薪工作。(恭喜!)你回到家里,告訴你的鄰居關于這份新工作,以及你對此感到非常興奮。你的朋友說他也在同一棟辦公樓工作。他建議你們兩個應該一起開車。你認為這是一個好主意。所以在工作的第一天,你去他家。你把車停在他家門口。你等了10分鐘,但你的鄰居仍然沒有出來。你繼續開始上班,因為你不想在第一天被推遲。現在這是TIMED_WAITING。
用技術術語解釋它,你是線程T1,你的鄰居是線程T2。你釋放鎖定(即停止駕駛汽車)并等待長達 10分鐘。如果你的鄰居T2在10分鐘內沒出來,你就開始再次開車了。
提示:線程在調用以下方法之一時將進入TIMED_WAITING狀態:
Thread#sleep()
Object#wait() 指定超時時間
Thread#join() 指定超時時間
LockSupport#parkNanos()
LockSupport#parkUntil()
結論當有人在分析線程轉儲時,理解這些不同的線程狀態是至關重要的。處于RUNNABLE,BLOCKED,WAITING和TIMED_WATING狀態的線程數是多少?哪些線程被阻止?誰阻止了他們?用于鎖定的對象是什么?這些是在線程轉儲中要分析的一些重要指標。這些詳細的線程轉儲分析可以通過在線工具輕松完成,例如:http://fastthread.io/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72784.html
摘要:以下為大家整理了阿里巴巴史上最全的面試題,涉及大量面試知識點和相關試題。的內存結構,和比例。多線程多線程的幾種實現方式,什么是線程安全。點擊這里有一套答案版的多線程試題。線上系統突然變得異常緩慢,你如何查找問題。 以下為大家整理了阿里巴巴史上最全的 Java 面試題,涉及大量 Java 面試知識點和相關試題。 JAVA基礎 JAVA中的幾種基本數據類型是什么,各自占用多少字節。 S...
摘要:方法可以將當前線程放入等待集合中,并釋放當前線程持有的鎖。此后,該線程不會接收到的調度,并進入休眠狀態。該線程會喚醒,并嘗試恢復之前的狀態。 并發 最近重新復習了一邊并發的知識,發現自己之前對于并發的了解只是皮毛。這里總結以下Java并發需要掌握的點。 使用并發的一個重要原因是提高執行效率。由于I/O等情況阻塞,單個任務并不能充分利用CPU時間。所以在單處理器的機器上也應該使用并發。為...
摘要:可能會持有相同的值對象但鍵對象必須是唯一的。當有新任務到達時,線程池沒有線程則創建線程處理,處理完成后該線程緩存秒,過期后回收,線程過期前有新任務到達時,則使用緩存的線程來處理。解決死鎖問題的三種方法預防死鎖檢測死鎖及避免死鎖。 最近辭職準備面試,順便整理一下面試題分享給大家,如有錯誤歡迎指出 01. 你對面向對象思想的理解? 面向對象編程簡稱OOP,是開發程序的一種方法、思想。面向...
摘要:超詳細的面試題總結一之基本知識多線程和虛擬機創建線程有幾種不同的方式你喜歡哪一種為什么繼承類實現接口應用程序可以使用框架來創建線程池實現接口。死亡線程方法執行結束,或者因異常退出了方法,則該線程結束生命周期。死亡的線程不可再次復生。 超詳細的Java面試題總結(一)之Java基本知識 多線程和Java虛擬機 創建線程有幾種不同的方式?你喜歡哪一種?為什么? 繼承Thread類 實現R...
摘要:不同于個人面經,這份面經具有普適性。我在前面的文章中也提到了應該怎么做自我介紹與項目介紹,詳情可以查看這篇文章備戰春招秋招系列初出茅廬的程序員該如何準備面試。是建立連接時使用的握手信號。它表示確認發來的數據已經接受無誤。 showImg(https://segmentfault.com/img/remote/1460000016972448?w=921&h=532); 該文已加入開源文...
閱讀 2916·2023-04-26 01:01
閱讀 3687·2021-11-23 09:51
閱讀 2519·2021-11-22 14:44
閱讀 3592·2021-09-23 11:57
閱讀 2834·2021-09-22 14:58
閱讀 5876·2021-09-10 11:25
閱讀 2106·2019-08-30 13:11
閱讀 1596·2019-08-30 12:59