1. 程式人生 > >Java併發程式設計札記-(一)基礎-03執行緒的生命週期

Java併發程式設計札記-(一)基礎-03執行緒的生命週期

本文主要講解Java中執行緒的狀態。Java中執行緒的狀態和作業系統中執行緒的狀態有所不同。

目錄

  1. 執行緒的生命週期
  2. 執行緒的狀態

執行緒的生命週期

MarkdownPhotos/master/CSDNBlogs/concurrency/0103/threadStaus.jpg

此圖是根據自己的瞭解畫的,如果有不足或錯誤歡迎指正。

執行緒的狀態

Java中執行緒有哪些狀態在Thread.State列舉中的介紹得很清楚。六種狀態分別是NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。在某一時間點,一個執行緒只能處於這些狀態中的一種。這些狀態是虛擬機器狀態,它們並沒有反映所有作業系統執行緒狀態。

NEW

新建狀態。尚未啟動的執行緒的狀態。如MyThread thread = new MyThread();

,thread就處於NEW狀態。

RUNNABLE

就緒狀態(可執行狀態)。可執行執行緒的執行緒狀態。thread.start();後,thread就處在處於RUNNABLE狀態。RUNNABLE狀態的某一執行緒可能正在Java虛擬機器中執行,但它也可能正在等待作業系統中的其他資源,比如CPU。一個執行緒在獲得CPU的資源後,才可以執行任務,否則排隊等待。

BLOCKED

阻塞狀態。 執行緒因為某些原因暫時停止執行,它就進入了阻塞狀態。直到某些條件發生,執行緒進入就緒狀態,才有機會繼續執行。
執行緒進入阻塞狀態有如下原因:

  • 執行時的執行緒呼叫某一物件的同步方法,若該物件的同步鎖被別的執行緒佔用,就只好進入阻塞狀態。等到獲得了同步鎖,才能進入就緒狀態。(API上只說了這一個原因)
  • 執行緒執行I/O操作或進行遠端通訊時,會因為等待相關的資源而進入阻塞狀態。等到獲得了相關資源,才能進入就緒狀態。(待確定)

WAITING

等待狀態。某一等待執行緒的執行緒狀態。處於等待狀態的執行緒正等待另一個執行緒,以執行特定操作。某一執行緒因為呼叫下列方法之一而處於等待狀態:

  • 不帶超時值的Object.wait。已經在某一物件上呼叫了Object.wait()的執行緒正等待另一個執行緒,以便在該物件上呼叫Object.notify()或Object.notifyAll()。
  • 不帶超時值的Thread.join。已經呼叫了Thread.join()的執行緒正在等待指定執行緒終止。
  • LockSupport.park。

TIMED_WAITING

定時等待狀態。具有指定等待時間的某一等待執行緒的執行緒狀態。某一執行緒因為呼叫以下帶有指定正等待時間的方法之一而處於定時等待狀態:

  • Thread.sleep。執行緒執行了Thread.sleep(int n)方法,執行緒將在n毫秒內放棄CPU,然後進入就緒狀態。
  • 帶有超時值的Object.wait。已經在某一物件上呼叫了Object.wait(long timeout)的執行緒正等待另一個執行緒,當對應的notify()被呼叫或者超出指定時間時執行緒重新進入就緒狀態。
  • 帶有超時值的Thread.join。例如,已經呼叫了join(long millis)的執行緒正在等待指定執行緒終止。等待該執行緒終止的時間最長為millis毫秒。超時為 0 意味著要一直等下去。
  • LockSupport.parkNanos。
  • LockSupport.parkUntil。

TERMINATED

終止狀態。已終止執行緒的執行緒狀態。執行緒已經結束執行。

在對Thread類做講解時會講到上述內容涉及到的方法。
本文就講到這裡,想了解更多內容請參考:

END.