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

Java多線程通訊之wait,notify的區(qū)別詳解

 更新時(shí)間:2018年07月24日 09:39:20   作者:LoseMyFuture  
這篇文章主要介紹了Java多線程通訊之wait,notify的區(qū)別詳解,非常不錯(cuò),具有一定的參考借鑒借鑒價(jià)值,需要的朋友可以參考下

下面通過(guò)代碼給大家介紹java多線程通訊之wait notify的區(qū)別,具體內(nèi)容如下所示:

class Res{
 public String username;
 public String sex;
}
class Out extends Thread{
 Res res;
 public Out(Res res){
  this.res=res;
 }
 @Override
 public void run() {
  //寫(xiě)操作
  int count=0;
  while (true){
//   synchronized (res.getClass()){
    if(count==0){//偶數(shù)
     res.username="小明";
     res.sex="男";
    } else {//奇數(shù)
     res.username="小紅";
     res.sex="女";
    }
    count=(count+1)%2;
//   }
   }
 }
}
class Input extends Thread{
 Res res;
 public Input(Res res){
  this.res=res;
 }
 @Override
 public void run() {
  while (true){
//   synchronized (res.getClass()){
    System.out.println(res.username+","+res.sex);
//   }
  }
 }
}
public class OutInputThread {
 public static void main(String[] args) {
  Res res = new Res();
  Out out = new Out(res);
  Input input = new Input(res);
  out.start();
  input.start();
 }
}
小紅,女
小紅,女
小紅,女
小紅,女
小紅,女
小紅,女
小紅,女
小紅,女
小紅,女

出現(xiàn)以上結(jié)果??消費(fèi)者一直消費(fèi)或者生產(chǎn)者一直生產(chǎn)

解決方法:生產(chǎn)者生產(chǎn)完成后消費(fèi)者方可消費(fèi),否者不可消費(fèi),消費(fèi)者未消費(fèi)或者未消費(fèi)完生產(chǎn)者不可生產(chǎn),一次生產(chǎn)一次消費(fèi)。其實(shí)也就是保證對(duì)res共享資源的操作同一時(shí)刻僅有同一個(gè)線程進(jìn)行操作,

wait、notify、notifyAll方法

wait、notify、notifyAll是三個(gè)定義在Object類里的方法,可以用來(lái)控制線程的狀態(tài)。

這三個(gè)方法最終調(diào)用的都是jvm級(jí)的native方法。隨著jvm運(yùn)行平臺(tái)的不同可能有些許差異。

 如果對(duì)象調(diào)用了wait方法就會(huì)使持有該對(duì)象的線程把該對(duì)象的控制權(quán)交出去,然后處于等待狀態(tài)。當(dāng)前線程從運(yùn)行變?yōu)樽枞尫潘馁Y源

如果對(duì)象調(diào)用了notify方法就會(huì)通知某個(gè)正在等待這個(gè)對(duì)象的控制權(quán)的線程可以繼續(xù)運(yùn)行。讓持有該鎖的線程從阻塞態(tài)變?yōu)榫途w。

如果對(duì)象調(diào)用了notifyAll方法就會(huì)通知所有等待這個(gè)對(duì)象控制權(quán)的線程繼續(xù)運(yùn)行。

注意:一定要在線程同步中使用,并且是同一個(gè)鎖的資源

通過(guò)以下方式即可完成需求。

生產(chǎn)者獲取res.getClass鎖后,如果flag為true生產(chǎn)者通過(guò)調(diào)用res.getClass.wait進(jìn)行等待,此時(shí)其他線程可獲取該鎖,如果flag為false,進(jìn)行生產(chǎn),然后設(shè)置flag為true保證資源消費(fèi)后方可再生產(chǎn),接著通過(guò)notify通知其他喚醒其他線程。

class Res{
 public String username;
 public String sex;
 //true 生產(chǎn)者等待,消費(fèi)者可消費(fèi) false生產(chǎn)者可以生產(chǎn),消費(fèi)者不可消費(fèi)
 public boolean flag=false;
}
class Out extends Thread{
 Res res;

 public Out(Res res){
  this.res=res;
 }
 @Override
 public void run() {
  //寫(xiě)操作
  int count=0;
  while (true){
   synchronized (res.getClass()){
    if(res.flag){
     try {
      res.getClass().wait();//讓當(dāng)前線程從運(yùn)行變?yōu)樽枞⑶裔尫潘馁Y源
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    if(count==0){//偶數(shù)
     res.username="小明";
     res.sex="男";
    } else {//奇數(shù)
     res.username="小紅";
     res.sex="女";
    }
    count=(count+1)%2;
    res.flag=true;
    res.getClass().notify();
   }
   }

 }
}
class Input extends Thread{
 Res res;
 public Input(Res res){
  this.res=res;
 }

 @Override
 public void run() {
  while (true){
   synchronized (res.getClass()){
    if(!res.flag){
     try {
      res.getClass().wait();
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    System.out.println(res.username+","+res.sex);
    res.flag=false;
    res.getClass().notify();
   }
  }
 }
}
public class OutInputThread {
 public static void main(String[] args) {
  Res res = new Res();
  Out out = new Out(res);
  Input input = new Input(res);
  out.start();
  input.start();
 }
}

輸出如下:

小明,男
小紅,女
小明,男
小紅,女
小明,男
小紅,女
小明,男
小紅,女

如果去掉notify會(huì)怎樣?去掉一個(gè)?去掉兩個(gè)?

去掉一個(gè)生產(chǎn)者可以打印多個(gè)(但是也不多),去掉消費(fèi)者僅可打印一個(gè),去掉兩個(gè)可能不打印,也可能打印1個(gè),所以wait、notify必須成對(duì)使用

wait(用于同步中)與sleep區(qū)別?

都是做休眠,wait需要notify

對(duì)于sleep方法,我們首先要知道該方法是屬于Thread類中的。而wait方法,則是屬于Object類中的。

sleep方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間,讓出cpu該其他線程,但是他的監(jiān)控狀態(tài)依然保持者,當(dāng)指定的時(shí)間到了又會(huì)自動(dòng)恢復(fù)運(yùn)行狀態(tài)。

在調(diào)用sleep方法的過(guò)程中,線程不會(huì)釋放對(duì)象鎖。

而當(dāng)調(diào)用wait方法的時(shí)候,線程會(huì)放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象調(diào)用notify方法后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲取對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。

總結(jié)

以上所述是小編給大家介紹的Java多線程通訊之wait,notify的區(qū)別詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Mybatis中resultMap的Colum和property屬性詳解

    Mybatis中resultMap的Colum和property屬性詳解

    這篇文章主要介紹了Mybatis中resultMap的Colum和property屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • java構(gòu)造方法的互相調(diào)用方式

    java構(gòu)造方法的互相調(diào)用方式

    這篇文章主要介紹了java構(gòu)造方法的互相調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • SpringMVC上傳文件并保存到本地代碼實(shí)例

    SpringMVC上傳文件并保存到本地代碼實(shí)例

    這篇文章主要介紹了SpringMVC上傳文件并保存到本地代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • jenkins+Maven從SVN上構(gòu)建項(xiàng)目的方法

    jenkins+Maven從SVN上構(gòu)建項(xiàng)目的方法

    這篇文章主要介紹了jenkins+Maven從SVN上構(gòu)建項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java實(shí)現(xiàn)即賦值也判斷的寫(xiě)法示例

    java實(shí)現(xiàn)即賦值也判斷的寫(xiě)法示例

    這篇文章主要為大家介紹了java實(shí)現(xiàn)即賦值也判斷的寫(xiě)法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • springboot的異步任務(wù):無(wú)返回值和有返回值問(wèn)題

    springboot的異步任務(wù):無(wú)返回值和有返回值問(wèn)題

    這篇文章主要介紹了springboot的異步任務(wù):無(wú)返回值和有返回值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringCloud?Gateway實(shí)現(xiàn)請(qǐng)求解密和響應(yīng)加密的過(guò)程解析

    SpringCloud?Gateway實(shí)現(xiàn)請(qǐng)求解密和響應(yīng)加密的過(guò)程解析

    這篇文章主要介紹了SpringCloud?Gateway實(shí)現(xiàn)請(qǐng)求解密和響應(yīng)加密的相關(guān)知識(shí),本文環(huán)境使用比較新的?Java?17?和?SpringBoot?3.1.5,對(duì)應(yīng)到Spring的版本是?6.0.13,本文重心是網(wǎng)關(guān)項(xiàng)目,需要的朋友可以參考下
    2023-11-11
  • postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù)

    postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù)

    這篇文章主要介紹了postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring MVC學(xué)習(xí)筆記之Controller查找(基于Spring4.0.3)

    Spring MVC學(xué)習(xí)筆記之Controller查找(基于Spring4.0.3)

    這篇文章主要給大家介紹了關(guān)于Spring MVC學(xué)習(xí)筆記之Controller查找(基于Spring4.0.3)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • SpringBoot中常用注解的使用合集

    SpringBoot中常用注解的使用合集

    注解?annotation一般是用來(lái)定義一個(gè)類、屬性和一些方法,以便程序能夠被編譯處理,本文為大家整理了SpringBoot中的常用注解以及它們的使用,需要的可以參考下
    2023-07-07

最新評(píng)論

郴州市| 红安县| 石渠县| 肥东县| 连城县| 牡丹江市| 海丰县| 北票市| 平顶山市| 班玛县| 富民县| 江陵县| 台北市| 尖扎县| 邹平县| 唐山市| 镇安县| 甘洛县| 江西省| 桐梓县| 莲花县| 深水埗区| 丹棱县| 额尔古纳市| 富蕴县| 乐亭县| 乐安县| 安西县| 绥宁县| 永春县| 苍梧县| 昭苏县| 依安县| 江陵县| 子长县| 叙永县| 民乐县| 邓州市| 韶山市| 武乡县| 岢岚县|