Java中線程的5種狀態

線程的狀態

參考資料: https://www.cnblogs.com/happy...

參考JVM虛擬機一書的內容,進行總結。html

關於線程的理解,咱們將一個線程當作是一個任務task,這樣應該更好理解。app

每個線程就是一個任務,咱們要執行一個任務,這個任務若是完成了,那麼咱們的程序功能就獲得了實現。

由於只有一個CPU,也就是說只有一個幹活的人。那麼咱們開始了那麼多的任務,CPU就須要頻繁地切換任務來執行,這樣咱們就能更好地理解任務的一些狀態了。spa

無限等待 線程

對於無線等待的任務,第一種狀況。code

假設有任務A和任務B,咱們在任務B的執行代碼中:A.join(); ,這表示把任務B放在任務A的後面執行,那麼任務B只有等待任務A作完以後才能夠繼續執行(準確地說是進入運行狀態)。也就是說咱們沒法肯定任務B等待的時間,這取決於任務A,因此這叫作無限等待。htm

對於無限等待的任務,第二種狀況。對象

假設有任務C和任務D,咱們在任務C的執行代碼中:Object.wait() ,這表示把任務C擱置,讓它無限等待下去。任務C何時能夠繼續執行呢?只有當其餘任務調用了notify()notifyAll() 方法以後,這表示CPU將去看看那些無限等待的任務(特指使用了wait() 方法而等待的任務),而後把它們喚醒(這些任務又進入了運行狀態)。這種狀況下,咱們沒法肯定任務C等待的時間,這取決於notify()notifyAll() 方法的通知,這就是無限等待的第二種狀況。blog

1、線程的5種狀態

新建(New) :使用new Thread() 建立一個線程以後。隊列

運行(Runnable) :使用Thread.start() 方法以後。啓動一個線程,該線程會進入等待隊列等待CPU的執行,所以能夠細分爲runnable和running狀態。rem

無限等待(waiting) :處於這種狀態的線程,不會被分配CPU執行時間,須要等待其餘線程顯式地喚醒,而後進入運行狀態。

  • 調用Thread.join() 方法。將會一直等待上一個線程的執行結束,而後被上一個線程喚醒。
  • 調用Object.wait() 方法。將會一直等待,直到其餘線程中使用了notify()、notifyAll()進行喚醒。

有限等待(timed waiting) :處於這種狀態的線程,不會被分配CPU執行時間,既能夠被其餘線程顯式地喚醒,也能夠在必定時間後由系統自動喚醒,而後進入運行狀態。

  • 調用Thread.sleep(timeout) 方法。該方法不會釋放持有的對象鎖。
  • 調用Object.wait(timeout) 方法。該方法會釋放持有的鎖。
  • 調用Thread.join(timeout) 方法。

阻塞(blocked) :阻塞和等待的區別在於,阻塞是在等待獲取一個排它鎖,由於該線程獲取不到鎖因此被阻塞住而不能容許;而等待則是等待一段時間或者是等待被喚醒,等待狀態並非等待獲取鎖。這個狀態有個特色,一個線程請求鎖,獲得以後該線程進入阻塞狀態;而其餘線程再來請求鎖,因爲得不到而阻塞;當該鎖釋放後,被阻塞的線程獲得鎖就進入了運行狀態。

  • synchronized 修飾的代碼塊、方法。使得線程之間有並行變成串行執行。
  • IO操做,也是串行執行。

結束(terminated) :當線程的run() 方法執行結束後,該線程就結束了。

圖示:

線程狀態

相關文章
相關標籤/搜索