【Java多線程】操作系統與Java中線程的生命週期

1 操作系統中的線程狀態

  • 創建:線程從創建到被cpu執行之前的這個階段。
  • 就緒:指線程已具備各種執行條件,一旦獲取cpu便可執行。
  • 運行:表示線程正獲得cpu在運行。
  • 阻塞:指線程在執行中因某件事而受阻,處於暫停執行的狀態,阻塞的線程不會去競爭cpu。
  • 終止:線程執行完畢,接下來會釋放線程佔用的資源。

線程的生命週期圖如下(進程與線程生命週期一樣):

2 Java中線程的狀態

Thread類中維護類一個內部枚舉類State,裏面是線程的狀態,屬性如下:

  • NEW:表示未啓動的線程。
  • RUNNABLE:表示線程正在JVM中執行,但執行的動作也可能是“等待”:等待操作系統的某些資源如處理器。
  • BLOCKED:表示線程正在等待一個鎖去進入某個同步方法或同步代碼塊。
  • WAITING:表示因爲調用接下來的方法,線程正在等待。包括:Object.wait()、Thread.join()和LockSupport.part()。直到另外一個線程執行一個特殊的動作該線程纔會退出等待狀態。如:該線程調用Object.wait(),需要另外一個線程調用Object.notify()或Object.notifyAll()。
  • TIMED_WAITING:表示線程因爲調用接下來的方法,線程正在等待,等待時間最多爲一個具體的值。包括:Thread.sleep(time)、Object.wait(time)、Thread.join(time)、LockSupport.parkNanos(time)和LockSupport.parkUntil(time)。直到另外一個線程執行一個特殊的動作該線程纔會退出等待狀態。如:該線程調用Object.wait(3000),另外一個線程調用Object.notify()或Object.notifyAll()可以使該線程退出等待狀態。
  • TERMINATED:表示一個終止的線程,這個線程的執行已經完成。

生命週期圖如下,下面紅色字體是操作系統中對應Java中的線程狀態:

注意Java中,當線程執行到同步代碼區,若線程被執行等待方法,則線程會釋放鎖並進入等待狀態,等待狀態的線程不會參與鎖的競爭,即若其它持有鎖的線程執行完成後不會喚醒處於等待狀態的線程,而阻塞狀態的線程可能會被喚醒。等待狀態的線程被喚醒後會從等待隊列移除,加入到阻塞隊列中,參與鎖的競爭。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章