最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA 線程通信相關(guān)知識匯總

 更新時間:2020年06月16日 16:39:19   作者:追  
這篇文章主要介紹了JAVA 線程通信相關(guān)知識,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

兩個線程之間的通信

多線程環(huán)境下CPU會隨機的在線程之間進行切換,如果想讓兩個線程有規(guī)律的去執(zhí)行,那就需要兩個線程之間進行通信,在Object類中的兩個方法wait和notify可以實現(xiàn)通信。

wait方法可以使當(dāng)前線程進入到等待狀態(tài),在沒有被喚醒的情況下,線程會一直保持等待狀態(tài)。
notify方法可以隨機喚醒單個在等待狀態(tài)下的線程。

來實現(xiàn)這樣的一個功能:
讓兩個線程交替在控制臺輸出一行文字

定義一個Print類,有兩個方法print1和print2,分別打印一行不同的內(nèi)容

package com.sutaoyu.volatlt;

public class Print {
 private int flag = 1;
 
 public void print1() {
  synchronized(this) {
   if(flag != 1) {
    try {
     //讓當(dāng)前線程進入等入狀態(tài)
     this.wait();
    }catch(InterruptedException e) {
     e.printStackTrace();
    }
   }
   
   System.out.println("monkey");
   flag = 2;
   //隨機的喚醒單個等待的線程
   this.notify();
  }
 }
 
 
 public void print2() {
  synchronized(this) {
   if(flag != 2) {
   try {
    this.wait();
   }catch (InterruptedException e){
    e.printStackTrace();
   }
  }
  System.out.println("1024");
  flag = 1;
  this.notify();
  }
 }
}

定義線程測試類,開啟兩個線程,分別運行Print類中print1和print2方法

package com.sutaoyu.volatlt;

public class NotifyTest01 {
 public static void main(String[] args) {
  Print p = new Print();
  Thread t1 = new Thread() {
   public void run() {
    while(true) {
     p.print1();
    }
   }
  };
  
  Thread t2 = new Thread() {
   public void run() {
    while(true) {
     p.print2();
    }
   }
  };
  t1.start();
  t2.start();
 }
}

三個及三個以上的線程之間的通信

改造上面代碼在Print類中添加一個print3方法,再開啟第三個線程來執(zhí)行這個方法。

另外需要修改的地方是:

1.因為notifyAll方法可以喚醒所有等待狀態(tài)的線程,所有用notifyAll方法來替代notify方法

2.當(dāng)線程被喚醒后,需要先判斷一下flag的值,if不會重新判斷flag值,而while會重新判斷flag的值,所以將Print中的if判斷修改為while判斷。

package com.sutaoyu.volatlt;

public class Print {
 private int flag = 1;
 
 public void print1() {
  synchronized(this) {
   while(flag != 1) {
    try {
     //讓當(dāng)前線程進入等入狀態(tài)
     this.wait();
    }catch(InterruptedException e) {
     e.printStackTrace();
    }
   }
   
   System.out.println("monkey");
   flag = 2;
   //隨機的喚醒單個等待的線程
   this.notifyAll();
  }
 }
 
 
 public void print2() {
  synchronized(this) {
   while(flag != 2) {
   try {
    this.wait();
   }catch (InterruptedException e){
    e.printStackTrace();
   }
  }
  System.out.println("1024");
  flag = 3;
  this.notifyAll();
  }
 }
 
 public void print3() {
  synchronized(this) {
   while(flag != 3) {
    try {
     this.wait();
    }catch(InterruptedException e) {
     e.printStackTrace();
    }
   }
   
   System.out.println("888");
   flag = 1;
   this.notifyAll();
  }
 }
}
package com.sutaoyu.volatlt;

public class NotifyTest01 {
 public static void main(String[] args) {
  Print p = new Print();
  Thread t1 = new Thread() {
   public void run() {
    while(true) {
     p.print1();
    }
   }
  };
  
  Thread t2 = new Thread() {
   public void run() {
    while(true) {
     p.print2();
    }
   }
  };
  
  Thread t3 = new Thread() {
   public void run() {
    while(true) {
     p.print3();
    }
   }
  };
  
  t1.start();
  t2.start();
  t3.start();
 }
}

線程通信注意事項

在print1,2,3方法中同步代碼塊中使用哪個對象作為鎖,那在調(diào)用wait和notify方法時一定要調(diào)用這個對象上的wait和notify方法。
上面程序使用this作為對象鎖,在下面調(diào)用的都是this.wait()和this.notify()方法。

在多線程執(zhí)行當(dāng)中
wait方法釋放對象鎖,根據(jù)上面的代碼示例,t1,t2,t3三個線程使用的是同一個對象鎖,如果wait方法不釋放鎖的話,別的線程就不能獲取到該鎖,也就不能獲取cpu的執(zhí)行權(quán)了。

sleep和notify方法不釋放對象鎖,上面代碼示例中,如果notify方法釋放鎖的話,別的線程就有可能獲取到cpu的執(zhí)行權(quán),這樣子就會導(dǎo)致當(dāng)前notify方法后面的代碼還未執(zhí)行完畢就失去了cpu的執(zhí)行權(quán),從而導(dǎo)致一些問題,只有當(dāng)線程執(zhí)行完synchronized代碼塊后才會釋放鎖。

以上就是JAVA 線程通信相關(guān)知識匯總的詳細(xì)內(nèi)容,更多關(guān)于JAVA 線程通信的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring 緩存抽象示例詳解

    Spring 緩存抽象示例詳解

    Spring框架自身并沒有實現(xiàn)緩存解決方案,但是從3.1開始定義了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口,提供對緩存功能的聲明,能夠與多種流行的緩存實現(xiàn)集成。這篇文章主要介紹了Spring 緩存抽象 ,需要的朋友可以參考下
    2018-09-09
  • 使用指定的JDK啟動IDEA的三種方法

    使用指定的JDK啟動IDEA的三種方法

    今天小編就為大家分享一篇關(guān)于使用指定的JDK啟動IDEA的三種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • java常用工具類 UUID、Map工具類

    java常用工具類 UUID、Map工具類

    這篇文章主要為大家詳細(xì)介紹了Java常用工具類,包括UUID工具類、Map工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 詳解SpringBoot如何使用JWT實現(xiàn)身份認(rèn)證和授權(quán)

    詳解SpringBoot如何使用JWT實現(xiàn)身份認(rèn)證和授權(quán)

    JSON?Web?Token(JWT)是一種用于在網(wǎng)絡(luò)應(yīng)用之間安全傳遞信息的開放標(biāo)準(zhǔn),本文主要為大家介紹了如何在Spring?Boot中使用JWT實現(xiàn)身份認(rèn)證和授權(quán),需要的可以了解下
    2023-10-10
  • 解讀spark添加二方包導(dǎo)致依賴沖突排查問題

    解讀spark添加二方包導(dǎo)致依賴沖突排查問題

    這篇文章主要介紹了spark添加二方包導(dǎo)致依賴沖突排查問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 高內(nèi)聚低耦合法則實例解析

    高內(nèi)聚低耦合法則實例解析

    這篇文章主要介紹了高內(nèi)聚低耦合法則實例代碼解析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Spring Boot企業(yè)常用的starter示例詳解

    Spring Boot企業(yè)常用的starter示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot企業(yè)常用starter的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java基礎(chǔ)之位運算知識總結(jié)

    Java基礎(chǔ)之位運算知識總結(jié)

    最近接觸到了java位運算,之前對位運算的了解僅僅停留在表現(xiàn)結(jié)果上,乘2除以2,對背后的原理并不了解,現(xiàn)在學(xué)習(xí)記錄一下,需要的朋友可以參考下
    2021-05-05
  • Java使用路徑通配符加載Resource與profiles配置使用詳解

    Java使用路徑通配符加載Resource與profiles配置使用詳解

    這篇文章主要介紹了Java使用路徑通配符加載Resource與profiles配置使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 解決Tomcat啟動報異常java.lang.ClassNotFoundException問題

    解決Tomcat啟動報異常java.lang.ClassNotFoundException問題

    這篇文章主要介紹了解決Tomcat啟動報異常java.lang.ClassNotFoundException問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評論

蒙自县| 洪江市| 昌邑市| 财经| 澎湖县| 宣武区| 天柱县| 西峡县| 广德县| 保定市| 老河口市| 南阳市| 收藏| 通化县| 天气| 新兴县| 富宁县| 双江| 阜宁县| 方城县| 通江县| 东光县| 镇宁| 乐都县| 鄯善县| 曲水县| 武功县| 丁青县| 临武县| 常熟市| 丹江口市| 江油市| 福建省| 英吉沙县| 惠州市| 沁源县| 子长县| 馆陶县| 施秉县| 镇原县| 鄂伦春自治旗|