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();
}
}
运行结果
来源:https://www.cnblogs.com/twuxian/p/11331077.html


猜你喜欢
- 这篇文章主要介绍了Java编码摘要算法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对
- 目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel直接上代码:一,POIPOI是apa
- 使用Spring Boot 与Dubbo集成,这里我之前尝试了使用注解的方式,简单的使用注解注册服务其实是没有问题的,但是当你涉及到使用注解
- 简介lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。比如日常开发过程中需要生产大量的JavaBean文件,每个Java
- 当我们需要制作动态炫酷科技感很强的UI时,美术一般会给我们提供一些序列图,这时候我们只需在程序里实现序列动画。一.动画机unity自带的帧动
- 做完一个Android项目之后,如何才能把项目发布到Internet上供别人使用呢?我们需要将自己的程序打包成Android安装包文件–AP
- Lambda表达式类似匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和方法名。Lambda允许把函数作为一个方法的参
- ListView在虚模式下,CheckBox无法点击,可以用此方法实现private void lvwTitle_MouseDown(obj
- 看似很鸡肋其实在某些特殊场景还是比较有用的。比如你将实体类转Map或者拿到一个Map结果的时候,你是怎么获取某个map的key和value。
- C++虚类相当于java中的抽象类,与接口的不同之处是:1.一个子类只能继承一个抽象类(虚类),但能实现多个接口2.一个抽象类可以有构造方法
- Spring Security是一款基于Spring框架的认证和授权框架,提供了一系列控制访问和保护应用程序的功能,同时也支持基于角色和权限
- 定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。类型:行为类模式类图:例子:例如
- 最近项目用到txt文件和xls文件的转换,这里记录一下具体的思路。下面利用java代码实现txt转xls,这里要使用到jxl.jar包,这个
- 前言:C# 10 对于 Lambda 做了很多的优化,我们可以在 C# 中更加方便地使用委托和 Lambda 了,下面就来看一些示例1、Na
- jar 包启动时指定配置文件 application.ymlnohup java -jar vPaas.jar --spring.confi
- Java 和 Groovy 中的映射map都是非常通用的,它允许关键字key和值value为任意类型,只要继承了 Object&n
- 本文实例讲述了Java简单工厂模式定义与用法。分享给大家供大家参考,具体如下:一 代码// 抽象产品(Abstract Product)角色
- Android 监听手机GPS打开状态实现代码GPS_Presenterpackage com.yiba.core;import andro
- 1.概述Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。Spring MVC的特