Java 创建两个线程模拟对话并交替输出实现解析
作者:小龙_T无限 时间:2022-01-10 02:37:02
需求说明
实现方式
嗯 这个可以视作一个经典的消费者和生产者的问题,详细见代码注释
代码内容
消费者,负责取走生产者产生的信息
/**
* @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();
}
}
运行结果
来源: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