日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java线程的不同状态

發布時間:2023/12/3 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java线程的不同状态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

在Java中,線程可以具有狀態。 Thread.State枚舉定義Java線程可以具有的不同狀態。 該枚舉定義了以下值–

  • 可運行
  • 已封鎖
  • 等候
  • TIMED_WAITING
  • 已終止
  • 在接下來的部分中,我將簡要概述這些狀態以及它們之間的可能過渡。

    Java線程的狀態

    這是線程首次創建時所獲得的默認狀態。

    可運行

    線程一開始執行,便立即進入RUNNABLE狀態。 請注意,等待獲取CPU來執行的線程仍處于此狀態。

    已封鎖

    線程在等待監視器鎖定時被阻塞,便立即進入BLOCKED狀態。 這可以通過以下兩種方式之一進行:

  • 它正在等待獲取鎖定以輸入同步的塊/方法。
  • 它正在等待重新獲取對其調用Object.wait方法的對象的監視器鎖定。
  • 等候

    線程由于調用以下方法之一而移至此狀態–

  • Object.wait沒有超時
  • Thread.join沒有超時
  • LockSupport.park
  • TIMED_WAITING

    線程由于調用以下方法之一而移至此狀態–

  • 線程睡眠
  • Object.wait超時
  • Thread.join超時
  • LockSupport.parkNanos
  • LockSupport.parkUntil
  • 已終止

    線程終止后,它將立即移至該狀態。

    可能的狀態轉換

    下圖顯示了不同狀態之間可能的轉換–


    安排執行線程后,它將立即進入RUNNABLE狀態。 已經用第一個箭頭(標記為1)顯示了此過渡。

    從RUNNABLE狀態,線程可以移至BLOCKED,WAITING,TIMED_WAITING或TERMINATED狀態中的任何一個。 從理論上講,如果線程不等待獲取任何鎖,或者不休眠,或者不調用任何使其等待的方法,則它僅完成執行并直接進入TERMINATED狀態(標記為2d)。

    當然,在實際應用中,上述情況極不可能發生。 線程通常試圖獲取鎖,在這種情況下,如果線程必須等待鎖,則它會進入BLOCKED(標記為2a)狀態。 線程還顯式地等待某些先決條件為真/來自其他線程的操作,在這種情況下,線程將根據等待是否計時而移至WAITING(標記為2b)或TIMED_WAITING(標記為2c)狀態。

    一旦線程移至BLOCKED狀態,接下來唯一允許的過渡就是移至RUNNABLE狀態(標記為3d)。

    同樣,從等待狀態的唯一可能轉換是移動到已阻止狀態(標記為3c)。

    請注意,Internet上的某些文章錯誤地添加了從WAITING到RUNNABLE狀態的過渡。 這只是不正確的。 線程永遠不能直接從WAITING狀態進入RUNNABLE狀態。 我們可以通過一個例子來了解其原因。

    假設我們有一個線程T,該線程當前處于RUNNABLE狀態,并持有三個對象a,b和c的監視器鎖定,如下圖所示–

    此時,T調用c.wait(),此后它不再持有對象c的監視器鎖定–

    使用調用notify / notifyAll通知T時,它立即停止等待并與其他線程(例如X和Y)競爭以獲取c的監視器鎖定–


    根據上面的定義,它是BLOCKED狀態。 僅在獲取了c的監視器鎖定后,T才進入RUNNABLE狀態。 可以對Thread.join()(內部使用Object.wait())和LockSupport.park()應用類似的推理。

    讓我們回到原始狀態轉換圖。 如我們所見,線程可以從TIMED_WAITING狀態移動到RUNNABLE(標記為3b)或BLOCKED(標記為3a)狀態。 在這種情況下,可以轉換為RUNNABLE,因為線程可以在調用Thread.sleep方法后進入TIMED_WAITING狀態,在這種情況下,它保留當前持有的所有監視器鎖定。

    當線程在RUNNABLE,BLOCKED,WAITING或TIMED_WAITING狀態之間來回移動后,完成執行時,它將一勞永逸地進入TERMINATED狀態。

    我們如何獲得線程的當前狀態?

    我們可以使用Thread.getState()方法來檢索線程的當前狀態。 我們可以使用此值來監視或調試應用程序在生產中可能遇到的任何并發問題。

    結論

    在本文中,我們簡要回顧了Java線程可以具有的不同狀態,以及線程如何在這些狀態之間移動。 與往常一樣,任何反饋/改進建議/評論都將受到高度贊賞!

    翻譯自: https://www.javacodegeeks.com/2019/01/different-states-java-threads.html

    總結

    以上是生活随笔為你收集整理的Java线程的不同状态的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。