在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在Java中的線程狀態轉換

冬至子 ? 來源:瑞煕share ? 作者:brevity wit ? 2023-06-02 10:07 ? 次閱讀

Java 中線程的生命周期中一共有 6 種狀態。New(新創建);Runnable(可運行);Blocked(被阻塞);Waiting(等待);Timed Waiting(計時等待);Terminated(被終止)。如果想要確定線程當前的狀態,可以通過 getState() 方法,并且線程在任何時刻只可能處于 1 種狀態。

New 新創建

圖片

New 表示線程被創建但尚未啟動的狀態:當我們用 new Thread() 新建一個線程時,如果線程沒有開始運行 start() 方法,所以也沒有開始執行 run() 方法里面的代碼,那么此時它的狀態就是 New。而一旦線程調用了 start(),它的狀態就會從 New 變成 Runnable,也就是狀態轉換圖中中間的這個大方框里的內容。

Runnable 可運行

圖片

Java 中的 Runable 狀態對應操作系統線程狀態中的兩種狀態,分別是 Running 和 Ready,也就是說,Java 中處于 Runnable 狀態的線程有可能正在執行,也有可能沒有正在執行,正在等待被分配 CPU 資源。所以,如果一個正在運行的線程是 Runnable 狀態,當它運行到任務的一半時,執行該線程的 CPU 被調度去做其他事情,導致該線程暫時不運行,它的狀態依然不變,還是 Runnable,因為它有可能隨時被調度回來繼續執行任務。

圖片

接下來,我們來看下 Runnable 下面的三個方框,它們統稱為阻塞狀態,在 Java 中阻塞狀態通常不僅僅是 Blocked,實際上它包括三種狀態,分別是 Blocked(被阻塞)、Waiting(等待)、Timed Waiting(計時等待),這三 種狀態統稱為阻塞狀態,下面我們來看看這三種狀態具體是什么含義。

Blocked 被阻塞

圖片

首先來看最簡單的 Blocked,從箭頭的流轉方向可以看出,從 Runnable 狀態進入 Blocked 狀態只有一種可能,就是進入 synchronized 保護的代碼時沒有搶到 monitor 鎖,無論是進入 synchronized 代碼塊,還是 synchronized 方法,都是一樣。我們再往右看,當處于 Blocked 的線程搶到 monitor 鎖,就會從 Blocked 狀態回到Runnable 狀態。

Waiting 等待

圖片

我們再看看 Waiting 狀態,線程進入 Waiting 狀態有三種可能性。

沒有設置 Timeout 參數的 Object.wait() 方法。

沒有設置 Timeout 參數的 Thread.join() 方法。

LockSupport.park() 方法。

Blocked 僅僅針對 synchronized monitor 鎖,可是在 Java 中還有很多其他的鎖,比如 ReentrantLock,如果線程在獲取這種鎖時沒有搶到該鎖就會進入 Waiting 狀態,因為本質上它執行了 LockSupport.park() 方法,所以會進入 Waiting 狀態。同樣,Object.wait() 和 Thread.join() 也會讓線程進入 Waiting 狀態。Blocked 與 Waiting 的區別是 Blocked 在等待其他線程釋放 monitor 鎖,而 Waiting 則是在等待某個條件,比如 join 的線程執行完畢,或者是 notify()/notifyAll() 。

Timed Waiting 限期等待

圖片

在 Waiting 上面是 Timed Waiting 狀態,這兩個狀態是非常相似的,區別僅在于有沒有時間限制,Timed Waiting 會等待超時,由系統自動喚醒,或者在超時前被喚醒信號喚醒。

以下情況會讓線程進入 Timed Waiting 狀態。

設置了時間參數的 Thread.sleep(long millis) 方法;

設置了時間參數的 Object.wait(long timeout) 方法;

設置了時間參數的 Thread.join(long millis) 方法;

設置了時間參數的 LockSupport.parkNanos(long nanos) 方法和 LockSupport.parkUntil(long deadline) 方法。

我們再來看下如何從這三種狀態流轉到下一個狀態。

圖片

想要從 Blocked 狀態進入 Runnable 狀態,要求線程獲取 monitor 鎖,而從 Waiting 狀態流轉到其他狀態則比較特殊,因為首先 Waiting 是不限時的,也就是說無論過了多長時間它都不會主動恢復。

圖片

只有當執行了 LockSupport.unpark(),或者 join 的線程運行結束,或者被中斷時才可以進入 Runnable 狀態。

圖片

如果其他線程調用 notify() 或 notifyAll()來喚醒它,它會直接進入 Blocked 狀態,這是為什么呢?因為喚醒 Waiting 線程的線程如果調用 notify() 或 notifyAll(),要求必須首先持有該 monitor 鎖,所以處于 Waiting 狀態的線程被喚醒時拿不到該鎖,就會進入 Blocked 狀態,直到執行了 notify()/notifyAll() 的喚醒它的線程執行完畢并釋放 monitor 鎖,才可能輪到它去搶奪這把鎖,如果它能搶到,就會從 Blocked 狀態回到 Runnable 狀態。

圖片

同樣在 Timed Waiting 中執行 notify() 和 notifyAll() 也是一樣的道理,它們會先進入 Blocked 狀態,然后搶奪鎖成功后,再回到 Runnable 狀態。

圖片

當然對于 Timed Waiting 而言,如果它的超時時間到了且能直接獲取到鎖/join的線程運行結束/被中斷/調用了LockSupport.unpark(),會直接恢復到 Runnable 狀態,而無需經歷 Blocked 狀態。

Terminated 終止

圖片

再來看看最后一種狀態,Terminated 終止狀態,要想進入這個狀態有兩種可能。run() 方法執行完畢,線程正常退出。出現一個沒有捕獲的異常,終止了 run() 方法,最終導致意外終止。

注意點

最后我們再看線程轉換的兩個注意點。線程的狀態是需要按照箭頭方向來走的,比如線程從 New 狀態是不可以直接進入 Blocked 狀態的,它需要先經歷 Runnable 狀態。線程生命周期不可逆:一旦進入 Runnable 狀態就不能回到 New 狀態;一旦被終止就不可能再有任何狀態的變化。所以一個線程只能有一次 New 和 Terminated 狀態,只有處于中間狀態才可以相互轉換。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2970

    瀏覽量

    104800
  • JAVA語言
    +關注

    關注

    0

    文章

    138

    瀏覽量

    20096
收藏 人收藏

    評論

    相關推薦

    Java線程的用法

    本文將介紹一下Java線程的用法。 基礎介紹 什么是多線程 指的是一個進程同時運行多個線程
    的頭像 發表于 09-30 17:07 ?958次閱讀

    Java線程池包括哪些

    線程池是用來統一管理線程的, Java 創建和銷毀線程都是一件消耗資源的事情,
    的頭像 發表于 10-11 15:33 ?823次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>的<b class='flag-5'>線程</b>池包括哪些

    Java線程阻塞方法大全

    IO是操作系統實現的,Java代碼并沒有辦法直接接觸到操作系統。以下是詳細的喚醒方法:1. sleep() 方法sleep(毫秒),指定以毫秒為單位的時間,使線程該時間內進入線程阻塞
    發表于 04-02 15:42

    Java線程喚醒與阻塞規則

    IO是操作系統實現的,Java代碼并沒有辦法直接接觸到操作系統。以下是詳細的喚醒方法:1. sleep() 方法:sleep(毫秒),指定以毫秒為單位的時間,使線程該時間內進入線程
    發表于 07-06 15:11

    Java線程的五種狀態

    java線程的五種狀態其實要真正高清,只需要明白計算機操作系統中進程的知識,原理都是相同的。
    發表于 08-02 07:59

    Java守護線程和本地線程的區別

    java線程分為兩種:守護線程(Daemon)和用戶線程(User)。
    發表于 08-07 08:10

    java線程設計模式_結城浩

    JAVA線程設計模式》通過淺顯易懂的文字與實例來介紹JAVA線程相關的設計模式概念,并且通過實際的JAVA程序范例和UML圖示來一一解說
    發表于 01-05 16:15 ?0次下載
    <b class='flag-5'>java</b>多<b class='flag-5'>線程</b>設計模式_結城浩

    java線程狀態圖和定義

    線程時由系統分配的,主要用來保存線程內部所使用的數據,如線程執行函數中所定義的變量。 注意:Java的多
    發表于 09-27 10:44 ?0次下載
    <b class='flag-5'>java</b><b class='flag-5'>線程</b>的<b class='flag-5'>狀態</b>圖和定義

    Java線程總結之Queue

    Java線程應用,隊列的使用率很高,多數生產消費模型的首選數據結構就是隊列。Java提供的線程
    發表于 11-28 16:14 ?3316次閱讀
    <b class='flag-5'>Java</b>多<b class='flag-5'>線程</b>總結之Queue

    java學習——java面試【事務、鎖、多線程】資料整理

    本文檔內容介紹了基于java學習java面試【事務、鎖、多線程】資料整理,供參考
    發表于 03-13 13:53 ?0次下載

    Java教程之零點起飛學Java線程資料說明

    線程編程是提高應用程序性能的重要手段之一。Java平臺從開始就被設計成為多線程環境,從語言級上支持多線程
    發表于 02-20 10:41 ?3次下載
    <b class='flag-5'>Java</b>教程之零點起飛學<b class='flag-5'>Java</b>的<b class='flag-5'>線程</b>資料說明

    Java線程學習基礎詳解

    使用 new 關鍵字和 Thread 類或其子類建立一個線程對象后,該線程對象就處于新建狀態。它保持這個狀態直到程序 start() 這個線程
    的頭像 發表于 12-10 22:02 ?374次閱讀

    為什么Java線程沒有Running狀態

    的說明: 一個 JVM 執行的線程處于這一狀態。(A thread executing in the
    的頭像 發表于 06-17 17:36 ?1453次閱讀

    Java線程池核心原理

    看過Java線程池源碼的小伙伴都知道,Java線程池中最核心的類就是ThreadPoolExecutor,
    的頭像 發表于 04-21 10:24 ?858次閱讀

    java實現多線程的幾種方式

    Java實現多線程的幾種方式 多線程是指程序包含了兩個或以上的線程,每個線程都可以并行執行不同
    的頭像 發表于 03-14 16:55 ?718次閱讀
    主站蜘蛛池模板: 性爽爽| 日本一区二区视频在线观看| 曰本女人色黄网站| 奇米影视7777| 成人五级毛片免费播放| 免费黄色小视频| 午夜69成人做爰视频网站| 日本在线亚洲| 不卡免费在线视频| 爱情岛网站亚洲禁18进入| 久久久黄色片| 视频免费观看网址| 香蕉操| ts 人妖 另类 在线| 好爽毛片一区二区三区四| 欧美日韩亚洲国产| 性生大片一级毛片免费观看| 亚洲成人在线网站| 一级做a爰片久久毛片美女图片| 亚洲一区二区三区免费观看| tube亚洲高清老少配| 久久久久久全国免费观看| 天天操2023| 天天干一干| 午夜大片网| 亚洲偷图色综合色就色| 四虎comwww最新地址| 4388x17亚洲最大成人网| 国内黄色精品| 国语对白老女人8av| 欧美成人免费午夜全| 日本色视| 奇米影视亚洲四色8888| 男人午夜视频在线观看| 欧美另类激情| 国产成人啪精品午夜在线观看 | 人与牲动交xxxxbbbb高清| 色多多免费在线观看| 色婷婷综合在线视频最新| 色在线播放| 激情婷婷网|