亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Java中實現多線程通信

發布時間:2021-04-17 16:39:33 來源:億速云 閱讀:133 作者:Leah 欄目:編程語言

本篇文章為大家展示了怎么在Java中實現多線程通信,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

1、共享變量

線程間通信可以通過發送信號,發送信號的一個簡單方式是在共享對象的變量里設置信號值。線程A在一個同步塊里設置boolean型成員變量hasDataToProcess為true,線程B也在同步代碼塊里讀取hasDataToProcess這個成員變量。這個簡單的例子使用了一個持有信號的對象,并提供了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) {
    //同一個對象
    final MySignal1 my = new MySignal1();
    //線程1設置hasDataToProcess值為true
    final Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        my.setHasDataToProcess(true);
      }
    });
    t1.start();
    //線程2取這個值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();
  }
}

運行結果如下:

t1改變以后的值:true

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

以資源為例,生產者生產一個資源,通知消費者就消費掉一個資源,生產者繼續生產資源,消費者消費資源,以此循環,代碼如下。

import sun.security.util.Password;

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

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

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

//生產者
class Producer implements Runnable {
  private Resource rs;

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

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

//消費者消費資源
class Consumer implements Runnable {
  private Resource rs;

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

  //消費者消費資源
  @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();
  }
}

運行結果如下:

Thread-0..生產者...商品----1+++++
Thread-1...消費者...商品----1+++++
Thread-0..生產者...商品----1+++++
Thread-1...消費者...商品----1+++++
Thread-0..生產者...商品----1+++++
Thread-1...消費者...商品----1+++++
Thread-0..生產者...商品----1+++++

上述內容就是怎么在Java中實現多線程通信,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平遥县| 弥渡县| 印江| 溧阳市| 湘乡市| 开封县| 广水市| 浙江省| 鸡泽县| 米林县| 安仁县| 清徐县| 贡嘎县| 莆田市| 忻州市| 巨野县| 桓仁| 朝阳县| 武鸣县| 滦南县| 通城县| 哈巴河县| 淄博市| 灵山县| 遵义县| 嘉峪关市| 赣州市| 荔浦县| 湖南省| 峨眉山市| 南华县| 广安市| 黔西县| 烟台市| 安乡县| 湖口县| 辽源市| 盐池县| 蒙阴县| 天门市| 房产|