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

Java多線程通信實(shí)現(xiàn)方式詳解

 更新時(shí)間:2019年11月22日 11:00:01   作者:最喜歡夏天了  
這篇文章主要介紹了Java多線程通信實(shí)現(xiàn)方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Java多線程通信實(shí)現(xiàn)方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

線程通信的方式:

1、共享變量

線程間通信可以通過發(fā)送信號,發(fā)送信號的一個(gè)簡單方式是在共享對象的變量里設(shè)置信號值。線程A在一個(gè)同步塊里設(shè)置boolean型成員變量hasDataToProcess為true,線程B也在同步代碼塊里讀取hasDataToProcess這個(gè)成員變量。這個(gè)簡單的例子使用了一個(gè)持有信號的對象,并提供了set和get方法。

public class MySignal1 {
  //共享的變量
  private boolean hasDataToProcess = false;

  //取值
  public boolean getHasDataProcess() {
    return hasDataToProcess;
  }

  //存值
  public void setHasDataToProcess(boolean hasDataToProcess) {
    this.hasDataToProcess = hasDataToProcess;
  }

  public static void main(String[] args) {
    //同一個(gè)對象
    final MySignal1 my = new MySignal1();
    //線程1設(shè)置hasDataToProcess值為true
    final Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        my.setHasDataToProcess(true);
      }
    });
    t1.start();
    //線程2取這個(gè)值hasDataToProcess
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          //等待線程1完成后取值
          t1.join();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        my.getHasDataProcess();
        System.out.println("t1改變以后的值:"+my.getHasDataProcess());
      }
    });
    t2.start();
  }
}

運(yùn)行結(jié)果如下:

t1改變以后的值:true

2、等待/喚醒(wait/notify)機(jī)制

以資源為例,生產(chǎn)者生產(chǎn)一個(gè)資源,通知消費(fèi)者就消費(fèi)掉一個(gè)資源,生產(chǎn)者繼續(xù)生產(chǎn)資源,消費(fèi)者消費(fèi)資源,以此循環(huán),代碼如下。

import sun.security.util.Password;

//資源類
class Resource {
  private String name;
  private int count = 1;
  private boolean flag = false;

  public synchronized void set(String name) {
    //生產(chǎn)資源
    while (flag) {
      try {
        //線程等待
        wait();
      } catch (InterruptedException e) {
      }
    }
    this.name = name + "----" + count + "+++++";
    System.out.println(Thread.currentThread().getName() + "..生產(chǎn)者..." + this.name);
    flag = true;
    //喚醒等待中的消費(fèi)者
    this.notifyAll();
  }

  public synchronized void out() {
    //消費(fèi)資源
    while (!flag) {
      try {
        //線程等待,生產(chǎn)者生產(chǎn)資源
        wait();
      } catch (InterruptedException e) {
      }
    }
    System.out.println(Thread.currentThread().getName() + "...消費(fèi)者..." + this.name);
    flag = false;
    //喚醒消費(fèi)者,生產(chǎn)資源
    this.notifyAll();
  }
}

//生產(chǎn)者
class Producer implements Runnable {
  private Resource rs;

  public Producer(Resource rs) {
    this.rs = rs;
  }

  //生產(chǎn)者生產(chǎn)資源
  @Override
  public void run() {
    while (true) {
      rs.set("商品");
    }
  }
}

//消費(fèi)者消費(fèi)資源
class Consumer implements Runnable {
  private Resource rs;

  public Consumer(Resource rs) {
    this.rs = rs;
  }

  //消費(fèi)者消費(fèi)資源
  @Override
  public void run() {
    while (true) {
      rs.out();
    }
  }
}

public class ProducerConsumerDemo {
  public static void main(String[] args) {
    Resource r = new Resource();
    Producer p = new Producer(r);
    Consumer c = new Consumer(r);
    Thread t1 = new Thread(p);
    Thread t2 = new Thread(c);
    t1.start();
    t2.start();
  }
}

運(yùn)行結(jié)果如下:

Thread-0..生產(chǎn)者...商品----1+++++
Thread-1...消費(fèi)者...商品----1+++++
Thread-0..生產(chǎn)者...商品----1+++++
Thread-1...消費(fèi)者...商品----1+++++
Thread-0..生產(chǎn)者...商品----1+++++
Thread-1...消費(fèi)者...商品----1+++++
Thread-0..生產(chǎn)者...商品----1+++++

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java堆&優(yōu)先級隊(duì)列示例講解(下)

    Java堆&優(yōu)先級隊(duì)列示例講解(下)

    這篇文章主要通過示例詳細(xì)為大家介紹Java中的堆以及優(yōu)先級隊(duì)列,文中的示例代碼講解詳細(xì),對我們了解java有一定幫助,需要的可以參考一下
    2022-03-03
  • SpringMVC form標(biāo)簽引入及使用方法

    SpringMVC form標(biāo)簽引入及使用方法

    這篇文章主要介紹了SpringMVC form標(biāo)簽引入及使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • IntelliJ IDEA多屏后窗口不顯示問題解決方案

    IntelliJ IDEA多屏后窗口不顯示問題解決方案

    這篇文章主要介紹了IntelliJ IDEA多屏后窗口不顯示問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java使用JDBC連接數(shù)據(jù)庫的實(shí)現(xiàn)方法

    Java使用JDBC連接數(shù)據(jù)庫的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java使用JDBC連接數(shù)據(jù)庫的實(shí)現(xiàn)方法,包括了詳細(xì)的加載步驟以及完整實(shí)現(xiàn)示例,需要的朋友可以參考下
    2014-09-09
  • Java中的Phaser并發(fā)階段器詳解

    Java中的Phaser并發(fā)階段器詳解

    這篇文章主要介紹了Java中的Phaser并發(fā)階段器詳解,Phaser由JDK1.7提出,是一個(gè)復(fù)雜強(qiáng)大的同步輔助類,是對同步工具類CountDownLatch和CyclicBarrier的綜合升級,能夠支持分階段實(shí)現(xiàn)等待的業(yè)務(wù)場景,需要的朋友可以參考下
    2023-12-12
  • 淺談UUID生成的原理及優(yōu)缺點(diǎn)

    淺談UUID生成的原理及優(yōu)缺點(diǎn)

    UUID是一套用于生成全局唯一標(biāo)識(shí)符的標(biāo)準(zhǔn),也被稱為GUID?(Globally?Unique?Identifier),通過使用UUID可以在分布式系統(tǒng)中生成唯一的?ID,UUID的生成方式有多種,本文將詳細(xì)講解?UUID?的生成原理、特性、實(shí)用場景以及優(yōu)缺點(diǎn)
    2023-06-06
  • 關(guān)于jvm的垃圾回收器以及觸發(fā)full gc的場景

    關(guān)于jvm的垃圾回收器以及觸發(fā)full gc的場景

    這篇文章主要介紹了關(guān)于jvm的垃圾回收器以及觸發(fā)full gc的場景,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 淺析Java如何在并發(fā)環(huán)境下生成一個(gè)只讀的map

    淺析Java如何在并發(fā)環(huán)境下生成一個(gè)只讀的map

    這篇文章主要為大家詳細(xì)介紹了Java如何在并發(fā)環(huán)境下生成一個(gè)只讀的map,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Maven setting配置鏡像倉庫的方法步驟

    Maven setting配置鏡像倉庫的方法步驟

    這篇文章主要介紹了Maven setting配置鏡像倉庫的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • SWT(JFace)Group(分組顯示)

    SWT(JFace)Group(分組顯示)

    SWT(JFace)體驗(yàn)之Group(分組顯示)
    2009-06-06

最新評論

芮城县| 清水河县| 巴马| 南和县| 乐山市| 砀山县| 江安县| 南投市| 松溪县| 马山县| 鄂伦春自治旗| 磐安县| 如皋市| 丰城市| 梁山县| 秭归县| 高邮市| 固原市| 额尔古纳市| 五家渠市| 临朐县| 平江县| 浦东新区| 泽州县| 大厂| 屯昌县| 民勤县| 陆川县| 闻喜县| 白水县| 汾阳市| 九江市| 揭阳市| 沿河| 建宁县| 建昌县| 鄂尔多斯市| 南宫市| 新宾| 彰化县| 汽车|