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

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

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

兩個(gè)線(xiàn)程之間的通信

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

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

來(lái)實(shí)現(xiàn)這樣的一個(gè)功能:
讓兩個(gè)線(xiàn)程交替在控制臺(tái)輸出一行文字

定義一個(gè)Print類(lèi),有兩個(gè)方法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)前線(xiàn)程進(jìn)入等入狀態(tài)
     this.wait();
    }catch(InterruptedException e) {
     e.printStackTrace();
    }
   }
   
   System.out.println("monkey");
   flag = 2;
   //隨機(jī)的喚醒單個(gè)等待的線(xiàn)程
   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();
  }
 }
}

定義線(xiàn)程測(cè)試類(lèi),開(kāi)啟兩個(gè)線(xiàn)程,分別運(yùn)行Print類(lèi)中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();
 }
}

三個(gè)及三個(gè)以上的線(xiàn)程之間的通信

改造上面代碼在Print類(lèi)中添加一個(gè)print3方法,再開(kāi)啟第三個(gè)線(xiàn)程來(lái)執(zhí)行這個(gè)方法。

另外需要修改的地方是:

1.因?yàn)閚otifyAll方法可以喚醒所有等待狀態(tài)的線(xiàn)程,所有用notifyAll方法來(lái)替代notify方法

2.當(dāng)線(xiàn)程被喚醒后,需要先判斷一下flag的值,if不會(huì)重新判斷flag值,而while會(huì)重新判斷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)前線(xiàn)程進(jìn)入等入狀態(tài)
     this.wait();
    }catch(InterruptedException e) {
     e.printStackTrace();
    }
   }
   
   System.out.println("monkey");
   flag = 2;
   //隨機(jī)的喚醒單個(gè)等待的線(xiàn)程
   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();
 }
}

線(xiàn)程通信注意事項(xiàng)

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

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

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

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

相關(guān)文章

  • Spring 緩存抽象示例詳解

    Spring 緩存抽象示例詳解

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

    使用指定的JDK啟動(dòng)IDEA的三種方法

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

    java常用工具類(lèi) UUID、Map工具類(lèi)

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

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

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

    解讀spark添加二方包導(dǎo)致依賴(lài)沖突排查問(wèn)題

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

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

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

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

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

    Java基礎(chǔ)之位運(yùn)算知識(shí)總結(jié)

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

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

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

    解決Tomcat啟動(dòng)報(bào)異常java.lang.ClassNotFoundException問(wèn)題

    這篇文章主要介紹了解決Tomcat啟動(dòng)報(bào)異常java.lang.ClassNotFoundException問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論

承德县| 湄潭县| 涟水县| 沙雅县| 台湾省| 陇川县| 佛冈县| 道孚县| 襄城县| 建阳市| 太仓市| 襄汾县| 塘沽区| 遂宁市| 利川市| 宁国市| 邳州市| 昌图县| 尼木县| 宝山区| 阿巴嘎旗| 专栏| 玉溪市| 淮北市| 贵南县| 察隅县| 额尔古纳市| 当雄县| 仪征市| 金沙县| 汽车| 色达县| 托克逊县| 胶州市| 喀什市| 青冈县| 柳江县| 边坝县| 同心县| 大港区| 溧阳市|