這篇文章主要講解了“Java線程的狀態有哪幾種”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java線程的狀態有哪幾種”吧!
Java 線程狀態轉換圖
Java 線程狀態
在 Java 線程的生命周期中,按復雜的并發場景考慮,可將 Java 線程的狀態分為七種,分別是:新建,可運行,運行,無限期等待,限期等待,阻塞,結束。
新創建一個線程對象,尚未執行。
2. 可運行(Runnable 或 Ready)狀態
新創建的線程調用 start 方法后便處于 Runnable 狀態,剛剛結束等待(獲取到鎖)或阻塞狀態的線程也會處于 Runnable 狀態,處于該狀態的線程位于可運行線程池中,等待獲取 CPU 資源。
處于 Runnable 狀態的線程獲取到 CPU 資源,執行程序代碼。
synchronized 代碼塊內被鎖住的對象調用了它的 wait() 方法或者在當前線程中調用了其他線程的 join() 方法,那么當前線程將會釋放占有的鎖,釋放 CPU 資源,阻塞在等待隊列里面,一直等待被 synchronized 修飾的對象調用 notify() 或 notifyAll() 方法喚醒或者 join 的其他線程執行結束(異常退出)。在并發時,處于無限期等待狀態的線程被喚醒之后,還要去競爭對象的鎖,如果競爭不到,線程將會被阻塞在對象的鎖池中,競爭到鎖之后,線程將會處于 Runnable 狀態。
5. 限期等待(Timed Waiting)狀態
與無限期等待(Waiting)狀態不同之處在于,調用 wait 和 join 方法時傳入了等待限定時間。另外,線程調用 sleep() 方法也會處于限期等待(Timed Waiting)狀態,會釋放 CPU 資源,但并不會釋放鎖,一直到休眠結束變成 Runnable 狀態。
6. 阻塞(Blocked)狀態
線程程序執行到 synchronized 代碼塊或 Reentrant.lock() 方法,對象的鎖被其他線程占用時,當前線程將會被阻塞在對象的鎖池中,處于阻塞(Blocked)狀態。
線程 run 方法執行完畢或者異常退出,則該線程的生命周期終結,不能再次使用。
感謝各位的閱讀,以上就是“Java線程的狀態有哪幾種”的內容了,經過本文的學習后,相信大家對Java線程的狀態有哪幾種這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。