91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java中等待喚醒機制的原理是什么

發布時間:2021-06-16 14:10:37 來源:億速云 閱讀:159 作者:Leah 欄目:編程語言

本篇文章為大家展示了Java中等待喚醒機制的原理是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

線程的狀態

首先了解一下什么是線程的狀態,線程狀態就是當線程被創建(new),并且啟動(start)后,它不是一啟動就進入了執行狀態(run),也不是一直都處于執行狀態。

這里說一下Java 的Thread類里面有一個State方法,這個方法里面涵蓋了6種線程的狀態,如下:

public enum State {
  // 尚未啟動的線程的線程狀態。
  NEW,

  // 可運行線程的線程狀態。
  RUNNABLE,

  // 線程的線程狀態被阻塞,等待監視器鎖定。
  BLOCKED,

  // 等待線程的線程狀態。
  WAITING,

  // 具有指定等待時間的等待線程的線程狀態。
  TIMED_WAITING,

  // 終止線程的線程狀態。
  TERMINATED;
}

導致這六種線程狀態發生的條件

New -- 新建

線程剛被創建,不過還沒有被啟動(還沒有調用start方法)

Runnable -- 可運行

處于可運行狀態的線程正在Java虛擬機中執行,但是它可能正在等待來自操作系統(例如處理器)的其他資源。

Blocked -- 鎖阻塞
當一個線程想獲取一個對象鎖,不過該對象鎖被其它的線程持有時,該線程就會進入鎖阻塞狀態;當該線程持有鎖的時候,該線程將會變成可運行的狀態。

Waiting -- 無限等待

當一個線程在等待另一個線程執行一個(喚醒)動作時,該線程就會進入無限等待狀態。進入這個狀態后是不能自動喚醒的,要等待另一個線程調用notify()方法,或notifyall()方法才能夠被喚醒。

Timed_Waiting -- 計時等待

類似于無限等待狀態,有幾個方法有超時參數,如:Thread.sleep、Object.wait方法。調用這些方法,進入計時等待狀態。計時等待狀態將會一直保持到超時期滿或者接收到喚醒通知。

terminated -- 被終止

1、因為run方法的正常退出而死亡。

2、因為沒有捕獲的異常,終止了run方法而死亡。

等待喚醒案例切入

顧客要去飯店吃飯,自助下單,說明要吃什么,數量是多少。下完單以后,顧客就等待該飯店廚師做飯菜,也就是Waiting狀態(無限等待狀態)。

廚師收到下單信息,開始做飯菜,做好飯菜,把飯菜遞到顧客桌面上,顧客看到飯菜已經來了(notify方法),就可以開吃了(等待喚醒機制)。

Java代碼實現(線程之間的通信)

分析

創建一個顧客線程:下單,告知廚師要什么菜,菜的數量,調用wait方法,放棄CPU的執行,進入到無限等待狀態(Waiting)

創建一個廚師線程:看到下單,花了3秒鐘做飯菜,做好之后,調用notify方法,喚醒顧客吃飯了。

注意

顧客線程和廚師線程,必須使用同步代碼塊包裹起來,保證等待和喚醒只能有一個在執行。

同步使用的鎖對象必須保證唯一。

只有鎖對象才能夠調用Object.wait方法和Object.notify方法。

代碼

public class Demo01WaitNotify {
  public static void main(String[] args) {
    // 創建鎖對象(要保證鎖唯一)
    Object object = new Object();

    // 創建一個顧客線程
    new Thread() {
      @Override
      public void run() {
        // 使用同步代碼塊包裹起來,保證等待和喚醒只能有一個在執行。
        synchronized (object) {
          // 顧客下單
          System.out.println("我要一個西虹市炒番茄,一個馬鈴薯炒土豆,兩碗米飯");
          // 調用wait方法,放棄CPU的執行,進入到無限等待狀態(Waiting)
          try {
            object.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          // 喚醒之后(飯菜上來后),吃飯!!!真香。
          System.out.println("我就是餓死,從這里跳下去,也不會吃你們一口飯。。。真香!!!!");
        }
      }
    }.start();

    // 創建一個廚師線程
    new Thread() {
      @Override
      public void run() {
        // 廚師收到下單請求,花三秒鐘把飯菜做好
        try {
          Thread.sleep(3000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        // 使用同步代碼塊包裹起來,保證等待和喚醒只能有一個在執行。
        synchronized (object) {
          System.out.println("我的飯菜三秒鐘做好了,你食唔食哦?");
          // 做好之后,調用notify方法,喚醒顧客吃飯了。
          object.notify();
        }
      }
    }.start();
  }
}

上述內容就是Java中等待喚醒機制的原理是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

岐山县| 郴州市| 花垣县| 巴楚县| 桃园县| 大宁县| 蓝田县| 株洲县| 新兴县| 隆昌县| 五家渠市| 吉木乃县| 阜新| 锡林浩特市| 车险| 房产| 游戏| 平南县| 塘沽区| 渝中区| 玛沁县| 六枝特区| 神池县| 衡东县| 富宁县| 营口市| 含山县| 广州市| 广水市| 珲春市| 仁寿县| 虞城县| 北宁市| 剑河县| 茌平县| 柳河县| 金塔县| 平南县| 鄱阳县| 西宁市| 年辖:市辖区|