欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java等待喚醒機制原理實例解析

 更新時間:2020年01月20日 15:01:52   作者:LeeHua  
這篇文章主要介紹了Java等待喚醒機制原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Java等待喚醒機制原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

線程的狀態(tài)

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

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

public enum State {
  // 尚未啟動的線程的線程狀態(tài)。
  NEW,

  // 可運行線程的線程狀態(tài)。
  RUNNABLE,

  // 線程的線程狀態(tài)被阻塞,等待監(jiān)視器鎖定。
  BLOCKED,

  // 等待線程的線程狀態(tài)。
  WAITING,

  // 具有指定等待時間的等待線程的線程狀態(tài)。
  TIMED_WAITING,

  // 終止線程的線程狀態(tài)。
  TERMINATED;
}

導致這六種線程狀態(tài)發(fā)生的條件

New -- 新建

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

Runnable -- 可運行

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

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

Waiting -- 無限等待

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

Timed_Waiting -- 計時等待

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

terminated -- 被終止

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

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

等待喚醒案例切入

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

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

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

分析

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

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

注意

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

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

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

代碼

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

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

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

控制臺輸出:

我要一個西虹市炒番茄,一個馬鈴薯炒土豆,兩碗米飯
我的飯菜三秒鐘做好了,你食唔食哦?
我就是餓死,從這里跳下去,也不會吃你們一口飯。。。真香?。。。?br />

上面的代碼,存在線程間的通信,那什么又是線程間的通信呢?簡單的說,就是多個線程在處理同一個資源,但是處理的動作(線程的任務)卻不同。如上,廚師線程做飯菜,顧客線程吃飯菜。那為什么要進行線程間的通信呢?多個線程并發(fā)執(zhí)行的時候,在默認情況下CPU是隨機切換線程的,當我們需要多個線程來共同完成一件任務,并且希望它們有規(guī)律的執(zhí)行的時候,那么多線程就之間就需要一些協(xié)調通信,來達到多線程共同操作一份數(shù)據(jù)。

對代碼中通信的理解:

對又沒有飯菜進行判斷——

1、沒有飯菜(False)。

2、顧客下單。

3、廚師做飯菜。

4、顧客線程等待。

5、廚師做好飯菜

6、修改飯菜的狀態(tài)(True)

7、有飯菜,廚師線程提醒顧客線程吃飯菜。

8、廚師線程等待

9、吃完飯菜,修改飯菜的狀態(tài)(False)

這就是顧客線程與廚師線程之間的通信。以此類推,其它Java程序中多線程的通信也是同樣的道理。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot Knife4j在線API文檔框架基本使用

    SpringBoot Knife4j在線API文檔框架基本使用

    knife4j是為Java MVC框架集成Swagger生成Api文檔的增強解決方案,這篇文章主要介紹了SpringBoot中使用Knife4J在線API文檔框架,需要的朋友可以參考下
    2022-12-12
  • Java實現(xiàn)Excel文件轉PDF(無水印無限制)

    Java實現(xiàn)Excel文件轉PDF(無水印無限制)

    這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)Excel文件轉PDF的效果,并可以無水印、無限制。文中的示例代碼講解詳細,需要的可以參考一下
    2022-06-06
  • java為什么需要虛擬機jvm原理詳解

    java為什么需要虛擬機jvm原理詳解

    這篇文章主要為大家介紹了java為什么需要虛擬機jvm的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-11-11
  • Java?中不全部使用?Static?方法的理由

    Java?中不全部使用?Static?方法的理由

    這篇文章主要介紹了Java?中不全部使用?Static?方法的理由,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 一文帶你掌握java8中的reduce操作

    一文帶你掌握java8中的reduce操作

    reduce?操作是一種通用的歸約操作,它可以實現(xiàn)從?Stream?中生成一個值,其生成的值不是隨意的,而是根據(jù)指定的計算模型,下面我們就來深入了解下java8中的reduce操作吧
    2023-12-12
  • Java實現(xiàn)顏色漸變效果

    Java實現(xiàn)顏色漸變效果

    這篇文章主要為大家詳細介紹了Java實現(xiàn)顏色漸變效果的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Java數(shù)據(jù)結構和算法之冒泡排序(動力節(jié)點Java學院整理)

    Java數(shù)據(jù)結構和算法之冒泡排序(動力節(jié)點Java學院整理)

    冒泡排序(Bubble Sort)是一種簡單的排序算法。本文重點給大家介紹java數(shù)據(jù)結構和算法之冒泡排序,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-04-04
  • Java的設計模式編程中迪米特法則的應用示例

    Java的設計模式編程中迪米特法則的應用示例

    這篇文章主要介紹了Java的設計模式編程中迪米特法則的應用示例,迪米特法則中主張創(chuàng)建和使用弱耦合的類,需要的朋友可以參考下
    2016-02-02
  • Springboot網站第三方登錄 微信登錄

    Springboot網站第三方登錄 微信登錄

    這篇文章主要為大家詳細介紹了Springboot網站第三方登錄 ,微信登錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java經典排序算法之歸并排序實現(xiàn)代碼

    Java經典排序算法之歸并排序實現(xiàn)代碼

    這篇文章主要介紹了Java經典排序算法之歸并排序實現(xiàn)代碼,歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的一個非常典型的應用,將已有序的子序列合并,得到完全有序的序列,需要的朋友可以參考下
    2023-10-10

最新評論