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

歡迎訪問 生活随笔!

生活随笔

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

java

(Java多线程)线程状态

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

文章目錄

    • 線程狀態概述
    • Timed Wating(計時等待)
    • Blocked(鎖阻塞)
    • Waiting無限等待

線程狀態概述

在API中java.lang.Thread.State 這個枚舉給了6種線程狀態:

線程狀態導致狀態發生條件
NEW(新建)線程剛被創建,但是并未啟動。還沒調用start方法。
Runnable(可運行)線程可以在java虛擬機中運行的狀態,可能正在運行自己代碼,也可能沒有,這取決于操作系統處理器。
Waiting(無限等待)一個線程在等待另一個線程執行一個(喚醒) 動作時,該線程進入Waiting狀態。進入這個狀態后是不能自動喚醒的,必須等待另一個線程調用notify或者ntifyll方法才能夠喚醒。
TimedWaiting(計時等待)同waiting狀態,有幾個方法有超時參數,調用他們將進入Timed Waiting狀態。這一狀態將一直保持到超時期滿或者接收到喚醒通知。帶有超時參數的常用方法有Thread.sleep、Object.wait.
Teminated(被終止)因為run方法正常退出而死亡,或者因為沒有捕獲的異常終止了run方法而死亡。

Timed Wating(計時等待)

  • Timed Waiting在API中的描述為: 一個正在限時等待另一個線程執行一個(喚醒)動作的線程處于這一狀態。
  • 在前面寫賣票的案例中,為了減少線程執行太快,現象不明顯等問題,在run方法中添加了sleep語句, 這樣就強制當前正在執行的線程休眠(暫停執行),以"減慢線程”。
  • 當調用了sleep方法之后, 當前執行的線程就進入到“休眠狀態",就是所謂的Timed Waiting(計時等待)。

注意:

  • 進入TIMED. WAITING狀態的一種常見情形是調用的sleep方法,單獨的線程也可以調用,不-定非要有協
    作關系。
  • 為了讓其他線程有機會執行,可以將Thread.sleep()的調用放線程run()之內。 這樣才能保證該線程執行過程
    中會睡眠
  • sleep與鎖無關, 線程睡眠到期自動蘇醒,并返回到Runnable (可運行)狀態。
  • Timed Waiting線程狀態圖:

    Blocked(鎖阻塞)

    • Blocked狀態在API中的介紹為:一個正在阻塞等待一個監視器鎖 (鎖對象)的線程處于這一狀態。比如,線程A與線程B代碼中使用同一鎖,如果線程A獲取到鎖,線程A進入到Runnable狀態,那么線程B就進入到Blocked鎖阻塞狀態。
    • 這是由Runnable狀態進入Blocked狀態。除此Waiting以及 Time Waiting狀態也會在某種情況下進入阻塞狀態。

    Blocked線程狀態圖

    Waiting無限等待

    • Wating狀態在API中介紹為: 一個正在無限期等待另一個線程執行一個特別的(喚醒)動作的線程處于這一狀態。

    案例演示:

    public class Demo04Waiting {//創建鎖對象public static Object obj = new Object();public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {while (true){synchronized (obj){System.out.println("顧客點菜");System.out.println("點完菜,等待上菜........");try {//進入無線等待,等待老板做菜obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {synchronized (obj) {try {Thread.sleep(3000);//等待5秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("菜做好了");obj.notify();}}}}).start();} }

    • 通過上述案例發現,一個調用了某個對象的Objet.wait方法的線程會等待另一個線程調用此對象的object.notify()方法或0bject.ntifyll()方法。
    • waiting狀態并不是一個線程的操作, 它體現的是多個線程間的通信,可以理解為多個線程之間的協作關系,多個線程會爭取鎖,同時相互之間又存在協作關系。
    • 當多個線程協作時,比如A, B線程,如果A線程在Runnable (可運行)狀態中調用了wait()方法那么A線程就進入了Waiting (無限等待)狀態,同時失去了同步鎖。假如這個時候B線程獲取到了同步鎖,在運行狀態中調用了notify()方法,那么就會將無限等待的A線程喚醒。注意是喚醒,如果獲取到鎖對象,那么A線程喚醒后就進入Runnable (可運行)狀態;如果沒有獲取鎖對象,那么就進入到Blocked (鎖阻塞狀態)。

    Waiting線程狀態圖

    總結

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

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