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

2019
0 57

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

 

留言(0)
加载更多
猜你喜欢
  • blog c#钩子序键盘事件监听(拦截系统组合键)WebBrowser浏览器控件

    1.什么是钩子序 hook(钩子)是windows提供的一种息处理机制平台,是指在序正常运行中接受信息前预先启动的函数,用来检查和修改传给该序的信息,(钩子)实际上是一个处理息的序段,过系统调用,把它挂入系统。
  • blog java集合linkedList

    1.linkedList的实现 linkedlist的实现是基于数据结构:双向链表。型图如 对于linkedList没有像arrayList一样有扩容的概念。也不需要移动数据。所以对于新增和删除操作add和remove
  • blog java集合Hashtable

    java集合Hashtable 一、构造方法 1.public Hashtable() public Hashtable() { this(11, 0.75f); } 无参构造,初始化一个容量为11,负载因子为0
  • blog jvm内存型分析-垃圾收集器和内存分配策略(1)

    jvm内存型分析-垃圾收集器和内存分配策略(1)         说起垃圾收集( Garbagc Collcction,GC),大部分人都把这项技术当做java语言的伴物。事实上,GC的历史比
  • blog 有关线的常用方法总结

    构造方法 1.Thread(Runnable target)。参数为实现了Runnable接口的类。 2.Thread(String name)。参数为线的名字。 3.Thread(Runnable target,Str
  • blog java集合ArrayList

    ArrayList的实现是一个动态数组,从源码中也可以看出。这就决定了他的查找效率高,可以直接过下标访问。但是对于删除和增加元素,需要大量的移动元素,所以插入和删除的效率就很低。ArrayList不是线安全的,只能用在单线环境下,多线
  • blog java并发编 service层处理并发事务加锁可能会无效

    java并发编 service层处理并发事务加锁可能会无效         最近注意到一个问题--在service层处理要多次操作数据库事务时往往要@Transactional事务注解,这个时候
  • blog 线的状态

    线共包括以下5种状态。1. 新建状态(New) : 线对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable): 也被称为“可执行状态”。线对象
  • blog jvm内存型分析(2)方法执行的过

    jvm内存型分析(1)已经对内存型进行了一个宏观的概括 http://www.jiajiajia.club/weblog/blog/artical/82那么下边具体分析一下方法执行的过还是以一个简单的类开始public class T
  • blog oauth 2.0密码框架搭建(java

    oauth 2.0密码框架搭建(java) 项目源码下载地址:http://www.jiajiajia.club/file/info/8GG7iM/109 一、什么是oauth协议       &nb