您的位置:首页 > 编程语言 > Java开发

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

2019-10-16 18:07 1831 查看

需求说明

实现方式

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

代码内容

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

/**
* @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();
}
}

运行结果

以上就是本文的全部内容,希望对大家的学习有所帮助

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息