Java 多線程(八) 線程狀態圖
結合多線程的學習過程,介紹線程的狀態圖,隨着學習的深入,這幅圖不斷加入新的內容。
一.線程基本狀態圖
這幅圖是在Java 多線程(三) 線程的生命周期及優先級出現過的:
圖中是線程運行的基本狀態:線程調用start()方法開始后,就進入到可運行狀態,隨着CPU的資源調度在運行和可運行之間切換;遇到阻塞則進入阻塞狀態。
二.加入同步的線程狀態圖
多線程的同步機制,及synchronized關鍵字的使用學習:
於是狀態圖加入了底下的一部分,如下:
當資源被一個線程訪問時,上鎖,其他線程就進入了一個鎖池(Lock pool);
當鎖被釋放,其他線程獲得了鎖,就變為可運行狀態。
三.加入線程間的相互作用
線程間的相互作用:Java 多線程(七) 線程間的通信
主要是wait和notify方法的介紹。
具有wait()和notify()的線程狀態圖:
線程調用了wait()方法之后,釋放掉鎖,進入等待池(Wait pool) ;收到通知之后等待獲取鎖,獲取鎖之后才可以運行。
總結
線程被阻塞可能是由於下面五方面的原因:(《Thinking in Java》)
1.調用sleep(毫秒數),使線程進入睡眠狀態。在規定時間內,這個線程是不會運行的。
2.用suspend()暫停了線程的執行。除非收到resume()消息,否則不會返回“可運行”狀態。
3.用wait()暫停了線程的執行。除非線程收到notify()或notifyAll()消息,否則不會變成“可運行”狀態。
4.線程正在等候一些IO操作完成。
5.線程試圖調用另一個對象的“同步”方法,但那個對象處於鎖定狀態,暫時無法使用。
所以其實仍然可以使用第一張圖來概括性地說明線程的生命周期及各個狀態。只不過線程被阻塞的情況分為很多種,后面的圖是細化說明。
所涉及到的兩種池:
Wait pool 等待池
Lock pool 鎖池
參考資料
聖思園張龍老師Java SE系列視頻教程。
《Thinking in Java》