Java中如何实现多线程通信

发布时间:2021-08-07 14:04:02 作者:Leah
来源:亿速云 阅读:141

这篇文章将为大家详细讲解有关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中如何实现多线程通信就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. Java中怎么实现排序
  2. Java多线程通信wait()和notify()代码实例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Python如何统计一个字符串中每个字符出现了多少次

下一篇:如何解决某些HTML字符打不出来的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》