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

硅谷探秘者 359 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();
	}
}

 

猜你喜欢
数据结构与算法 449 中我们可能会遇到在处理正常业务的过中,其中会夹杂着一些非必需或不是特别重要的业务,而且这些业务还比较耗时,这个时候为了不影响正常业务性能,我们可以这些不是特别重要而且还比较耗时的业务独立出来
java基础 2123 1.什么是线线信的两个基本问题是互斥和同步。线同步是指线间所具有的一种制约关系,一个线的执行依赖另一个线息,当它没有得到另一个线息时应等待,直到息到达时才被唤醒
java基础 537 1.先看一下线命周期转换图(学java的此图必背)本篇文章的主要目的不是分析线的各种状态间的转换,而主要是研究一下线间的机制,以及Object的wait方法和notify方法。所以
official 35 上一篇文章《(mq)rabbitmq息发送确认》介绍了息发布时的确认方案,本篇文章将介绍,确认的方法。和确认发布一样,有时也需要确认,rabbitmq有三种确认
java基础 3266 待队列变为非空。2.阻塞队列的应用场景:阻塞队列常用于的场景,是向队列里添加元素的线是从队列里取元素的线。简而言,阻塞队列是用来存放元素、获取元素的容器。3
java虚拟机(jvm) 483 硬件的效率与一致性在正讲解Java虚拟机并发相关的知识前,我们先花一点时间去了解一下物理计算机中的并发问题,物理机遇到的并发问题与虚拟机中的情况有不少相似处,物理机对并发的处理方案对于虚拟机
java基础 2297 java启动线的三种方1.继承Thread类,重写run方法,调用start方法启动线2.实现Runnable接口,重写run方法,调用start方法启动线3.实现Callable接口代码如
java基础 908 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
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议
目录
祝愿神州十三飞行乘组平安归来