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

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

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

下面通過代碼給大家介紹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() {
  //寫操作
  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é)果??消費者一直消費或者生產(chǎn)者一直生產(chǎn)

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

wait、notify、notifyAll方法

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

這三個方法最終調(diào)用的都是jvm級的native方法。隨著jvm運行平臺的不同可能有些許差異。

 如果對象調(diào)用了wait方法就會使持有該對象的線程把該對象的控制權(quán)交出去,然后處于等待狀態(tài)。當前線程從運行變?yōu)樽枞?,釋放所的資源

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

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

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

通過以下方式即可完成需求。

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

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

 public Out(Res res){
  this.res=res;
 }
 @Override
 public void run() {
  //寫操作
  int count=0;
  while (true){
   synchronized (res.getClass()){
    if(res.flag){
     try {
      res.getClass().wait();//讓當前線程從運行變?yōu)樽枞?,并且釋放所的資源
     } 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會怎樣?去掉一個?去掉兩個?

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

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

都是做休眠,wait需要notify

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

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

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

而當調(diào)用wait方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調(diào)用notify方法后本線程才進入對象鎖定池準備獲取對象鎖進入運行狀態(tài)。

總結(jié)

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

相關(guān)文章

  • JAVA實現(xiàn)基于Tcp協(xié)議的簡單Socket通信實例

    JAVA實現(xiàn)基于Tcp協(xié)議的簡單Socket通信實例

    本篇文章主要介紹了JAVA實現(xiàn)基于Tcp協(xié)議的簡單Socket通信實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • async-excel實現(xiàn)多sheet異步導出方法詳解

    async-excel實現(xiàn)多sheet異步導出方法詳解

    這篇文章主要介紹了async-excel實現(xiàn)多sheet異步導出方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • Gitlab CI-CD自動化部署SpringBoot項目的方法步驟

    Gitlab CI-CD自動化部署SpringBoot項目的方法步驟

    本文主要記錄如何通過Gitlab CI/CD自動部署SpringBoot項目jar包。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • java樹結(jié)構(gòu)stream工具類的示例代碼詳解

    java樹結(jié)構(gòu)stream工具類的示例代碼詳解

    Stream 作為 Java 8 的一大亮點,它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。今天通過本文重點給大家介紹java樹結(jié)構(gòu)stream工具類的示例代碼,感興趣的朋友一起看看吧
    2022-03-03
  • Java設計模式之外觀模式

    Java設計模式之外觀模式

    這篇文章介紹了Java設計模式之外觀模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 解決Jenkins集成SonarQube遇到的報錯問題

    解決Jenkins集成SonarQube遇到的報錯問題

    本文給大家分享Jenkins集成SonarQube遇到的報錯問題及解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • SpringBoot_Cache自定義使用SimpleCacheManager方式

    SpringBoot_Cache自定義使用SimpleCacheManager方式

    這篇文章主要介紹了SpringBoot_Cache自定義使用SimpleCacheManager方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java身份證號碼校驗工具類詳解

    Java身份證號碼校驗工具類詳解

    這篇文章主要為大家詳細介紹了Java身份證號碼校驗工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Java中定時器Timer致命缺點案例詳解

    Java中定時器Timer致命缺點案例詳解

    這篇文章主要介紹了Java中定時器Timer致命缺點,以Java中定時器Time為案例整理下我的學習方法,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • 解決idea中javaweb的mysql8.0.15配置問題

    解決idea中javaweb的mysql8.0.15配置問題

    這篇文章主要介紹了idea中javaweb的mysql8.0.15配置問題 ,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論