栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 创建两个线程模拟对话并交替输出实现解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 创建两个线程模拟对话并交替输出实现解析

需求说明

实现方式

嗯 这个可以视作一个经典的消费者和生产者的问题,详细见代码注释

代码内容

消费者,负责取走生产者产生的信息


public class Consumer extends Thread{
  private MiddleMan mid = null;


  public Consumer() {
  }

  public Consumer(MiddleMan movie) {
    this.mid = movie;
  }

  @Override
  public void run() {
    //循环显示50次电影信息
    for (int i = 0; i <1000 ; i++) {
      try {
 Thread.sleep(100);
      } catch (InterruptedException e) {
 e.printStackTrace();
      }
      this.mid.get();
    }
  }
}

生产者,负责生产信息


public class Producer implements Runnable{
  //生产数据
  private MiddleMan mid = null;
  private boolean flag = false;

  public Producer(MiddleMan movie) {
    this.mid = movie;
  }

  public Producer() {
  }

  @Override
  public void run() {
    //循环录入,两部电影交替录人
    for (int i = 0; i <1000; i++) {
      if (flag){
 this.mid.set("jack说:","我是查水表");
 flag = false;
      } else {
 this.mid.set("rose说:","你是谁啊?");
 flag = true;
      }
    }
  }
}

信息中转场地 负责控制生产和消费的节奏

package com.duo;


public class MiddleMan {
  private String name;
  private String info;
  private boolean flag = true; //设置标志位,控制生产者生产,消费者消费

  public String getName() {
    return name;
  }

  public String getInfo() {
    return info;
  }

  public MiddleMan(String name, String info) {
    this.name = name;
    this.info = info;
  }

  public MiddleMan() {
  }

  public synchronized void set(String name,String info){
    if (!flag){
      try {
 super.wait();  //当前线程等待
      } catch (InterruptedException e) {
 e.printStackTrace();
      }
    }
      this.name = name;
    try {
      Thread.sleep(100);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
      this.info = info;
    flag = false;  //重置标志位,让消费者消费
    super.notify(); //使用Object的notify方法,让消费者线程被唤醒
  }
  public synchronized void get(){
    if (flag){
      try {
 super.wait();
      } catch (InterruptedException e) {
 e.printStackTrace();
      }
    }
    System.out.println(this.getName()+"-"+this.getInfo());
    flag = true;
    super.notify(); //唤醒线程
  }
}

程序入口


public class Test {
  public static void main(String[] args) {
    //生产===>>拿走  生产出来就被拿走
    MiddleMan mid = new MiddleMan();
    Thread producer = new Thread(new Producer(mid));
    Thread consumer = new Thread(new Consumer(mid));
    producer.start();
    consumer.start();
  }
}

运行结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/136804.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号