Java多線程之線程的狀態以及線程間協作通訊導致的狀態變換

來源:互聯網
上載者:User

標籤:佔用   使用權   notify   ...   實現   dead   執行   系統   .com   

    一:線程的狀態以及變化圖

     Java中線程中狀態可分為五種:New(建立狀態),Runnable(就緒狀態),Running(運行狀態),Blocked(阻塞狀態),Dead(死亡狀態)。

  New:建立狀態,當線程建立完成時為建立狀態,即new Thread(...),還沒有調用start方法時,線程處於建立狀態。

  Runnable:就緒狀態,當調用線程的的start方法後,線程進入就緒狀態,等待CPU資源。處於就緒狀態的線程由Java運行時系統的線程發送器(thread scheduler)來調度。

  Running:運行狀態,就緒狀態的線程擷取到CPU執行權以後進入運行狀態,開始執行run方法。

  Blocked:阻塞狀態,線程沒有執行完,由於某種原因(如,I/O操作等)讓出CPU執行權,自身進入阻塞狀態。

  Dead:死亡狀態,線程執行完成或者執行過程中出現異常,線程就會進入死亡狀態。

      

    (圖來自牛客網,如有冒犯,請告知刪除。)

 

    二:線程間協作通訊以及其導致的狀態變化

      1:線程間的同步協作

         由syncrhoized同步鎖、ReentrantLock、ReadWriteLock等待同步機制,實現線程之間的同步。

         線程獲得鎖則進入就緒態,等待CPU調度進入運行態;

         線程申請被佔用的鎖,則進入阻塞態,讓出CPU使用權。直到獲得該鎖後,重新進入就緒態,等待CPU調度進入運行態。

 

      2:線程間的通訊協作

         在獲得鎖而執行的線程執行時,執行到某處時需要申請同一把鎖的其他線程先執行,此時就需要讓出同步鎖以及CPU(進入阻塞態),讓其他線程先擷取同步鎖以及CPU而執行。直到其他線程執行完並釋放同步鎖後通知它喚醒(就緒態),才接著申請同步鎖以及CPU而繼續執行下去(運行態)。

         這個線程之間 讓出資源、掛起、喚醒 就是通過線程的通訊來實現的。

         syncrhoized加鎖的線程的wait()/notify()/notifyAll()以及ReentrantLock加鎖的線程的Condition調用await()/signal()/signalAll()就是具體的線程通訊。  

 

      3:線程自身的動作

          線程自身可以通過調用 sleep() 方法進入阻塞態,暫時讓出CPU資源(但是不釋放鎖),休眠時間過後自動回復就緒態等待CPU調度執行;

          線程自身可以通過調用 yield() 方法由運行態變為就緒態;這個過程稱為“讓步”,即正在啟動並執行線程讓出CPU給就緒態中的線程先執行一下,自己則回到就緒態中等待CPU再次調度自己執行;

          線程可以在自身執行過程中,通過 其他線程對象.join() 方法把已經啟動的其他線程先執行完 ,再繼續執行自身的餘下操作。可以通過這個方法來實現線程之間順序執行。

Java多線程之線程的狀態以及線程間協作通訊導致的狀態變換

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.