java线程通讯之生产者消费者模式

硅谷探秘者 1498 0 0

java线程通讯之生产者消费者模式

        生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。

一个生产和消费商品的例子(java)
package a;
import java.util.Random;
class Goods{
	public String name;
	public int price;
	@Override
	public String toString() {
		return name+":"+price;
	}
}
class Hamburger extends Goods{
	public Hamburger(String name,int price) {
		this.price=price;
		this.name=name;
	}
}
class Pizza extends Goods{
	public Pizza(String name,int price) {
		this.price=price;
		this.name=name;
	}
}
/**
 * 	相当于一个生产机器(生产和消费交替执行)
 */
class Model{
	private Goods g;
	public synchronized Goods make() throws InterruptedException {
		if(g!=null) {
			this.wait();
		}
		if(new Random().nextInt(100)%2==0) {
			g=new Hamburger("汉堡",100);
		}else {
			g=new Pizza("披萨",200);
		}
		System.out.println("生产-->"+g);
		this.notify();
		return g;
	}
	public synchronized Goods buy() throws InterruptedException {
		if(g==null) {
			this.wait();
		}
		Goods gl=g;
		System.out.println("消费-->"+g);
		g=null;
		this.notify();
		return gl;
	}
} 
/**
 *	生产者
 */
class Producer extends Thread{
	public Producer(Model m) {
		this.m=m;
	}
	private Model m;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<10;i++) {
			try {
				m.make();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
/**
 * 	消费者
 */
class Consumer extends Thread{
	public Consumer(Model m) {
		this.m=m;
	}
	private Model m;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<10;i++) {
			try {
				m.buy();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
public class A5 {
	public static void main(String[] args) {
		Model m=new Model();
		Producer p=new Producer(m);
		p.start();
		Consumer c=new Consumer(m);
		c.start();
	}
}

 


评论区
请写下您的评论...
暂无评论...
猜你喜欢
数据结构与算法 1574 中我们可能会遇到在处理正常业务的过中,其中会夹杂着一些非必需或不是特别重要的业务,而且这些业务还比较耗时,这个时候为了不影响正常业务性能,我们可以这些不是特别重要而且还比较耗时的业务独立出来
java基础 3289 1.什么是线线信的两个基本问题是互斥和同步。线同步是指线间所具有的一种制约关系,一个线的执行依赖另一个线息,当它没有得到另一个线息时应等待,直到息到达时才被唤醒
java基础 1896 1.先看一下线命周期转换图(学java的此图必背)本篇文章的主要目的不是分析线的各种状态间的转换,而主要是研究一下线间的机制,以及Object的wait方法和notify方法。所以
official 1266 上一篇文章《(mq)rabbitmq息发送确认》介绍了息发布时的确认方案,本篇文章将介绍,确认的方法。和确认发布一样,有时也需要确认,rabbitmq有三种确认
java基础 4400 待队列变为非空。2.阻塞队列的应用场景:阻塞队列常用于的场景,是向队列里添加元素的线是从队列里取元素的线。简而言,阻塞队列是用来存放元素、获取元素的容器。3
java虚拟机(jvm) 1688 硬件的效率与一致性在正讲解Java虚拟机并发相关的知识前,我们先花一点时间去了解一下物理计算机中的并发问题,物理机遇到的并发问题与虚拟机中的情况有不少相似处,物理机对并发的处理方案对于虚拟机
java基础 4695 java启动线的三种方1.继承Thread类,重写run方法,调用start方法启动线2.实现Runnable接口,重写run方法,调用start方法启动线3.实现Callable接口代码如
java基础 2063 Java分为两种线:用户线和守护线所谓守护线是指在序运行的时候在后台提供一种用服务的线,比如垃圾回收线就是一个很称职的守护,并且这种线并不属于序中不可或缺的部分。因此,当所有的
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1 2024-08  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript 加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。