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

作者:小龙_T无限 时间:2022-01-10 02:37:02 

需求说明

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

实现方式

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

代码内容

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


/**
* @auther::9527
* @Description: 消费者
* @program: 多线程
* @create: 2019-08-10 10:45
*/
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();
   }
 }
}

生产者,负责生产信息


/**
* @auther::9527
* @Description:
* @program: 多线程
* @create: 2019-08-10 10:39
*/
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;

/**
* @auther::9527
* @Description: 生产者和消费者
* @program: 多线程
* @create: 2019-08-10 10:36
*/
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(); //唤醒线程
 }
}

程序入口


/**
* @auther::9527
* @Description: 测试类
* @program: 多线程
* @create: 2019-08-10 11:47
*/
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();
 }
}

运行结果

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

来源:https://www.cnblogs.com/twuxian/p/11331077.html

标签:java,创建,线程,模拟,对话,输出
0
投稿

猜你喜欢

  • Android非XML形式动态生成、调用页面的方法

    2022-11-11 11:26:01
  • C#实现创建标签PDF文件的示例代码

    2023-09-15 07:04:58
  • java中map与实体类的相互转换操作

    2023-03-14 01:42:35
  • Java利用MessageFormat实现短信模板的匹配

    2023-02-19 11:41:54
  • JVM Client和Server端有什么区别

    2023-08-05 22:49:53
  • Android 判断某个Activity 是否在前台运行的实例

    2023-07-24 19:29:21
  • C# 透明窗体制作实现方法比较分析

    2022-11-26 02:35:30
  • Java中Arraylist动态扩容方法详解

    2023-04-30 23:25:53
  • C#实现常见加密算法的示例代码

    2023-05-08 12:44:43
  • flutter日期选择器 flutter时间选择器

    2023-09-22 04:50:15
  • 手把手教你如何获取微信用户openid

    2023-11-04 01:01:21
  • Android编程显示网络上的图片实例详解

    2021-11-29 05:21:10
  • C# 使用Fiddler捕获本地HttpClient发出的请求操作

    2022-06-28 04:10:34
  • Day14基础不牢地动山摇-Java基础

    2023-03-21 09:04:46
  • java计算两点间的距离方法总结

    2023-12-21 17:32:45
  • Java重写equals及hashcode方法流程解析

    2023-10-14 06:53:13
  • c# Thread类线程常用操作详解

    2021-09-20 21:35:51
  • Java实现一个简易版的多级菜单功能

    2023-08-21 14:33:56
  • Repeater中添加按钮实现点击按钮获取某一行数据的方法

    2022-05-17 08:19:31
  • Android仿微信Viewpager-Fragment惰性加载(lazy-loading)

    2023-12-16 23:50:59
  • asp之家 软件编程 m.aspxhome.com