Java多线程通信实现方式详解

 更新时间:2019年11月22日 11:00:01   作者:最喜欢夏天了  
这篇文章主要介绍了Java多线程通信实现方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了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设计模式中桥接模式应用详解

    Java设计模式中桥接模式应用详解

    桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯。桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。本文通过示例详细介绍了桥接模式的原理与使用,需要的可以参考一下
    2022-11-11
  • Intellij IDEA如何去掉@Autowired 注入警告的方法

    Intellij IDEA如何去掉@Autowired 注入警告的方法

    这篇文章主要介绍了Intellij IDEA如何去掉@Autowired 注入警告的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • IDEA项目重命名的操作

    IDEA项目重命名的操作

    这篇文章主要介绍了IDEA项目重命名的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java 非阻塞I/O使用方法

    Java 非阻塞I/O使用方法

    这篇文章主要介绍了Java 非阻塞I/O使用方法,文中涉及非阻塞I/O的简介,同时向大家展示了利用非阻塞I/O实现客户端的方法,需要的朋友可以参考下。
    2017-09-09
  • springboot连接neo4j报错的解决方案

    springboot连接neo4j报错的解决方案

    这篇文章主要介绍了springboot连接neo4j报错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 解析ConcurrentHashMap: 红黑树的代理类(TreeBin)

    解析ConcurrentHashMap: 红黑树的代理类(TreeBin)

    ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment的结构和HashMap类似,是一种数组和链表结构,今天给大家普及java面试常见问题---ConcurrentHashMap知识,一起看看吧
    2021-06-06
  • Java中的HashSet集合解析

    Java中的HashSet集合解析

    这篇文章主要介绍了Java中的HashSet集合解析,HashSet 实现 Set 接口,内部维护一个 HashMap 实例,它不能保证集合迭代的顺序,也不能保证顺序不变,HashSet 允许 null 元素,需要的朋友可以参考下
    2023-11-11
  • SpringBoot和Swagger结合提高API开发效率

    SpringBoot和Swagger结合提高API开发效率

    这篇文章主要介绍了SpringBoot和Swagger结合提高API开发效率的相关资料,需要的朋友可以参考下
    2017-09-09
  • Spring JPA之save方法示例详解

    Spring JPA之save方法示例详解

    这篇文章主要为大家介绍了Spring JPA之save方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java中Jar包反编译解压和压缩操作方法

    Java中Jar包反编译解压和压缩操作方法

    JAR文件就是Java 档案文件Java Archive,它是 Java 的一种文档格式,这篇文章主要介绍了Java中Jar包反编译解压和压缩,需要的朋友可以参考下
    2023-09-09

最新评论