天天看點

線程的生命周期 - 了解Java中線程的狀态線程的狀态建立(New)就緒(Runnable)運作(Running)阻塞/等待(Blocked/Waiting)死亡(Dead)

    如果你在工作中需要使用到線程,或是需要在多線程環境下程式設計,那麼了解線程的生命周期(Life Cycle of Thread)以及線程的狀态(Thread States)是很有必要的。

    正如我們在上一篇文章中了解到的,通過實作Runnable接口或是繼承Thread類,我們可以建立一個Java線程類。如果想要啟動線程,我們需要建立一個線程類,然後調用它的start()方法來執行run()中的任務,這樣就能将其線程來運作。

線程的狀态

    下圖展示了Java中線程的不同狀态,需要注意的是,雖然我們建立并啟動了線程,但是線程在就緒、運作、阻塞狀态間切換則是由作業系統的線程排程器來實作的,Java對此實際上并沒有完全控制權。

線程的生命周期 - 了解Java中線程的狀态線程的狀态建立(New)就緒(Runnable)運作(Running)阻塞/等待(Blocked/Waiting)死亡(Dead)

建立(New)

    我們使用new操作符來建立新的線程對象,線程的狀态是“建立”。此時,線程并不是活躍的,它隻是Java程式的一個内部狀态。

就緒(Runnable)

    當我們調用線程對象的start()方法時,線程的狀态切換為“就緒”,而線程的控制權就交給了線程排程器,直至線程結束運作為止。作業系統的線程排程器決定立即啟動線程,或是暫時先把它放在就緒線程隊列中。

運作(Running)

    當線程開始執行時,它的狀态切換為“運作”。線程排程器從就緒隊列中選出一個線程,并将它的狀态改為“運作”,然後CPU開始執行該線程。如果目前時間片結束,線程會被切換到就緒狀态。run()方法執行結束,線程進入死亡狀态。而如果線程需要等待某些資源,它則會進入阻塞狀态。

阻塞/等待(Blocked/Waiting)

    可以使用join方法可以讓線程進入等待狀态直至另一個線程結束運作。或是當線程需要通路某些資源時,例如生産者消費者問題、服務員通知或是IO資源,它也會進入等待狀态。一旦線程結束等待,它就進入就緒狀态,并被移回就緒線程隊列中。

死亡(Dead)

    一旦線程執行結束,它就會進入死亡狀态,此時的線程被視為失去活力。

    以上就是線程的不同狀态,了解它們并了解如何進行線程狀态切換,對你是很有幫助的。

原文位址:Life Cycle of Thread - Understanding Thread States in Java