Java中如何实现多线程通信
创始人
2024-12-24 02:03:58
0次

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+++++

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...