Java 多線程(八) 線程狀態圖,java多線程

來源:互聯網
上載者:User

Java 多線程(八) 線程狀態圖,java多線程

  結合多線程的學習過程,介紹線程的狀態圖,隨著學習的深入,這幅圖不斷加入新的內容。

 

一.線程基本狀態圖

  這幅圖是在Java 多線程(三) 線程的生命週期及優先順序出現過的:

  圖中是線程啟動並執行基本狀態:線程調用start()方法開始後,就進入到可運行狀態,隨著CPU的資源調度在運行和可運行之間切換;遇到阻塞則進入阻塞狀態。

 

二.加入同步的線程狀態圖

  多線程的同步機制,及synchronized關鍵字的使用學習:

  Java 多線程(五) 多線程的同步

  Java 多線程(六) 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 鎖池

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.