中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java線程狀態是怎樣的

發布時間:2021-12-27 16:41:01 來源:億速云 閱讀:156 作者:iii 欄目:大數據

這篇文章主要介紹“Java線程狀態是怎樣的”,在日常操作中,相信很多人在Java線程狀態是怎樣的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java線程狀態是怎樣的”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Java 線程狀態

Java 線程狀態定義在 Thread.State 枚舉中,使用  thread#getState 方法可以獲取當前線程的狀態。

Thread.State 狀態如下圖

Java線程狀態是怎樣的  
State.png

可以看到 Java 線程總共存在 6 中狀態,分別為:

  • NEW(初始狀態)

  • RUNNABLE(運行狀態)

  • BLOCKED(阻塞狀態)

  • WATTING(等待狀態)

  • TIMED_WAITING(限時等待狀態)

  • TERMINATED(終止狀態)

NEW(初始狀態)與 RUNNABLE(運行狀態)

每個使用  new Thread() 剛創建出線程實例狀態處于 NEW 狀態,一旦調用 thread.start(),線程狀態將會變成 RUNNABLE

RUNNABLE(運行狀態) 與 BLOCKED(阻塞狀態)

RUNNABLE 狀態的線程在進入由 synchronized修飾的方法或代碼塊前將會嘗試獲取一把隱式的排他鎖,一旦獲取不到,線程狀態將會變成  BLOCKED,等待獲取鎖。一旦有其他線程釋放這把鎖,線程成功搶到該鎖,線程狀態就將會從 BLOCKED 轉變為 RUNNABLE 狀態。

RUNNABLE(運行狀態) 與 WATTING(等待狀態)

處于 WATTING 狀態的線程將會一直處于無限期的等待狀態,需要等待其他線程喚醒。總共存在三種方法將會使線程從 RUNNABLE 變成 WATTING

  1. Object#wait

線程在獲取到 synchronized 隱式鎖后,顯示的調用 Object#wait()方法。這種情況下該線程將會讓出隱式鎖,一旦其他線程獲取到該鎖,且調用了  Object.notify()object.notifyAll(),線程將會喚醒,然后變成 RUNNABLE

  1. Thread#join

join方法是一種線程同步方法。假設我們在 main 方法中執行 Thread A.join() 方法,main 線程狀態就會變成 WATTING。直到 A 線程執行完畢,main 線程才會再變成 RUNNABLE

  1. LockSupport#park()

LockSupport 是 JDK 并發包里重要對象,很多鎖的實現都依靠該對象。一旦調用 LockSupport#park(),線程就將會變為 WATTING 狀態。如果需要喚醒線程就需要調用 LockSupport#unpark,然后線程狀態重新變為 RUNNABLE

RUNNABLE(運行狀態) 與 TIMED_WAITING(限時等待狀態)

TIMED_WAITINGWATTING 功能一樣,只不過前者增加限時等待的功能,一旦等待時間超時,線程狀態自動變為 RUNNABLE。以下幾種情況將會觸發這種狀態:

  1. Thread#sleep(long millis)

  2. 占有 synchronized 隱式鎖的線程調用 Object.wait (long timeout) 方法

  3. Thread#join (long millis)

  4. LockSupport#parkNanos (Object blocker, long deadline)

  5. LockSupport#parkUntil (long deadline)

RUNNABLE(運行狀態)與 TERMINATED(終止狀態)

線程一旦執行結束或者線程執行過程發生異常且未正常捕獲處理,狀態都將會自動變成 TERMINATED

Java 線程 6 種狀態看起來挺復雜的,但其實上面 BLOCKEDWATTINGTIMED_WAITING,都會使線程處于休眠狀態,所以我們將這三類都歸類為休眠狀態。這么分類的話,Java 線程生命周期就可以簡化為下圖:

Java線程狀態是怎樣的  
java線程狀態2.png
 

通用操作系統線程狀態

上面講完 Java 系統的線程狀態,我們來看下通用操作系統的線程狀態。操作系統線程狀態可以分為初始狀態,可運行狀態,運行狀態,休眠狀態以及終止狀態,如下圖:

Java線程狀態是怎樣的  
操作系統線程狀態1.png

這 5 中狀態詳細情況如下:

  1. 初始狀態,這時候線程剛被創建,還不能分配 CPU 。

  2. 可運行狀態,線程等待系統分配 CPU ,從而執行任務。

  3. 運行狀態,操作系統將 CPU 分配給線程,線程執行任務。

  4. 休眠狀態,運行狀態下的線程如果調用阻塞 API,如阻塞方式讀取文件, 線程狀態就將變成休眠狀態。這種情況下,線程將會讓出 CPU 使用權。休眠結束,線程狀態將會先變成可運行狀態。

  5. 線程執行結束或者執行過程發生異常將會使線程進入終止狀態,這個狀態下線程使命已經結束。 

對比兩者線程狀態

比較 Java 線程與操作系統線程,可以發現 Java 線程狀態沒有可運行狀態。也就是說 Java 線程 RUNNABLE 狀態包括了操作系統的可運行狀態與運行狀態。一個處于  RUNNABLE 狀態 Java 線程,在操作系統層面狀態可能為可運行狀態,正在等待系統分配 CPU 使用權。

另外 Java 線程細分了操作系統休眠狀態,分成了 BLOCKEDWATTINGTIMED_WAITING 三種。

當線程調用阻塞式 API,線程進入休眠狀態,這里指的是操作系統層面的。從 JVM 層面,Java 線程狀態依然處于 RUNNABLE 狀態。JVM 并不關心操作系統線程實際狀態。從 JVM 看來等待 CPU 使用權(操作系統線程狀態為可運行狀態)與等待 I/O (操作系統線程狀態處于休眠狀態)沒有區別,都是在等待某種資源,所以都歸入 RUNNABLE 狀態。

其他 Java 線程狀態與操作線程狀態類似。

到此,關于“Java線程狀態是怎樣的”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文山县| 孝义市| 百色市| 阿巴嘎旗| 嫩江县| 咸丰县| 商河县| 鄂伦春自治旗| 江都市| 清水县| 哈尔滨市| 呼图壁县| 茂名市| 台南市| 吉林市| 南木林县| 黄浦区| 寿光市| 行唐县| 含山县| 桑日县| 太原市| 阿鲁科尔沁旗| 布尔津县| 娱乐| 包头市| 滦平县| 广德县| 上杭县| 葫芦岛市| 平阳县| 枣强县| 巴里| 和硕县| 和田市| 麻江县| 新丰县| 河间市| 冕宁县| 奉化市| 勐海县|