你以前看的執行緒狀態轉換圖可能都是錯的-圖解併發程式設計第二篇
本文作為圖解java併發程式設計的第二篇,前一篇訪問地址如下所示:
圖形說明
在開始想寫這篇文章之前,我去網上搜索了很多關於執行緒狀態轉換的圖,我驚訝的發現:超過80%的圖都是不完整的,或者是錯的。所以我只好再次去閱讀原始碼,然後畫出下面的這張圖,理解了這張圖,對於大家理解java 執行緒的方法呼叫及開發過程會有很大的幫助。
-
同步阻塞狀態比較好理解,就是互斥鎖,當前執行緒使用到的程式碼塊,只有我用完了你才能用。 -
延時等待狀態與等待狀態的主要區別在於 -
延時等待狀態不會釋放任何資源及監視器。我就是佔著茅坑不拉屎,也不給你用。我就是休息一會,我休息完了,我的還是我的。 -
等待阻塞狀態會暫時釋放相關執行緒資源及監視器,我的資源暫時借給你用,等我notify找你的時候你要將資源還給我
Thread.State原始碼註釋
public enum State {
/**
* 新生狀態:執行緒物件建立,但是還未start()
*/
NEW,
/**
* 執行緒處於可執行狀態,但是這個可執行狀態並不代表執行緒一定在虛擬機器中執行。
* 需要等待從作業系統獲取到資源(比如處理器時間片),才能真正的去執行
*/
RUNNABLE,
/**
* 當前執行緒處於阻塞狀態,正在等待另一個執行緒的monitor lock釋放,才進入synchronized程式碼塊或方法
*/
BLOCKED,
/**
* 呼叫Object.wait() 、 Thread.join方法後當前執行緒處於等待狀態,
* 等待其他的執行緒執行特定的動作,才能從等待狀態退出。
* 比如:Object.wait()的執行緒需要等待其他執行緒呼叫Object.notify()、Object.notifyAll()才能退出
* 比如:呼叫了Thread.join()的執行緒需要等待指定的執行緒執行完成才能退出等待狀態。
*/
WAITING,
/**
* 進入特定時間內的等待狀態,等待一段指定的時間sleep(timed)、wait(timed)或者等待Thread.join(timed)的時間.
* 到達指定時間點自動退出恢復到RUNNABLE狀態
*/
TIMED_WAITING,
/**
* 執行緒結束狀態
*/
TERMINATED;
}
本文分享自微信公眾號 - 字母哥課堂(zimug_blog)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。
「其他文章」
- 長篇圖解java反射機制及其應用場景
- 併發程式設計系列之Lock鎖可重入性與公平性
- java併發程式設計JUC第十二篇:AtomicInteger原子整型
- java併發程式設計JUC第十一篇:如何線上程之間進行對等資料交換
- java併發程式設計JUC第十篇:CyclicBarrier執行緒同步
- java併發程式設計JUC第九篇:CountDownLatch執行緒同步
- java併發程式設計JUC第八篇:ConcurrentHashMap
- java併發程式設計工具類JUC第七篇:BlockingDeque雙端阻塞佇列
- java併發程式設計工具類JUC第六篇:SynchronousQueue同步佇列
- java併發程式設計工具類JUC第五篇:PriorityBlockingQueue優先順序佇列
- java併發程式設計工具類JUC第四篇:LinkedBlockingQueue連結串列佇列
- java併發程式設計工具類JUC第三篇:DelayQueue延時佇列
- java併發程式設計工具類JUC第二篇:ArrayBlockingQueue
- java併發程式設計工具類JUC第一篇:BlockingQueue阻塞佇列
- 快速入門Redis呼叫Lua指令碼及使用場景介紹
- Mybatis plus通用欄位自動填充的最佳實踐總結
- 詳解執行緒池的作用及Java中如何使用執行緒池
- Java9系列第九篇-對HTTP2協議的支援與非阻塞HTTP-API
- 跨站資源共享CORS原理深度解析
- 你以前看的執行緒狀態轉換圖可能都是錯的-圖解併發程式設計第二篇