设计模式-生产者消费者模式
来源:互联网 发布:北京程序员 编辑:程序博客网 时间:2024/05/16 03:27
生产者-消费者问题:
生产者向产品区里放产品,当产品区里满了,生产者需要等待;消费者从产品区里取产品腾出容量,生产者可继续生产,当产品区里空了,需要等待生产者生产。
public class ProducerAndConsumer{ //创建缓冲区 private static Buffer buffer = new Buffer(); public static void main(String[] args) {//创建生产者 Thread producer = new Thread(new Producer());//创建消费者 Thread consumer = new Thread(new Consumer());//开始生产 consumer.start();//开始消费 producer.start(); } //消费者线程 static class Consumer implements Runnable { public void run(){ try{ while(true){//消费 buffer.poll(); Thread.sleep(1000)); } }catch(InterruptedException ex){} } } //生产者线程 static class Producer implements Runnable { public void run(){ try{ while(true){//生产 buffer.push(new Random().nextInt(20)); Thread.sleep(1000); } }catch(InterruptedException ex){} } }}//缓冲池class Buffer{ //创建锁 private static Lock lock = new ReentrantLock(); //条件1:缓冲池为空 private static Condition empty = lock.newCondition(); //条件2:缓冲池为满 private static Condition full = lock.newCondition(); //缓冲池大小 private static final int size = 10; //缓冲池 private Queue<Integer> queue = new LinkedList<Integer>(); //消费 public void poll(){ lock.lock(); try{ while(queue.size() == 0){ System.out.println("无产品可消费,等待生产者生产。"); empty.await(); } int num = queue.poll(); System.out.println("出售商品:" + num);//通知生产者:仓库有位置了 full.signal(); }catch(InterruptedException ex){ }finally{ lock.unlock(); } } //生产 public void push(int num){ lock.lock(); try{//库存不能大于仓库额定容量:10 while(queue.size() == 10){ System.out.println("Wait for consumer:"); full.await(); }//商品入库 queue.offer(num); System.out.println("生产商品:" + num);//通知消费者:商品已经来了 empty.signal(); }catch(InterruptedException ex){ }finally{ lock.unlock(); } }}
0 0
- 设计模式-生产者消费者模式
- 设计模式 - 生产者-消费者模式
- 设计模式--生产者消费者模式
- 设计模式-生产者消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- Java设计模式之生产者消费者模式
- 设计模式—生产者消费者模式
- 完美解决WebView与上层父元素的TouchMove事件冲突
- codeforces 339C C. Xenia and Weights(dp)
- LA 3135 Argus 优先队列
- 将数据从DATASET导入到WINFORM中的LISTVIEW、LISTBOX、COMBOBOX控件的方法
- linux常用命令-1
- 设计模式-生产者消费者模式
- (2.2.2.3)设计模式--单例模式(三)改进型懒汉式-线程安全型
- Palindrome Partitioning II
- Maximal Rectangle
- ARM9 ADS8344 SPI驱动移植 (三)
- Best Time to Buy and Sell Stock III
- java学习之BigInteger类、BigDecimal类
- ASP.NET在主题中添加CSS文件
- [刷题]Best Time to Buy and Sell Stock II