java实现生产者消费者问题
来源:互联网 发布:斗战神帐号淘宝 编辑:程序博客网 时间:2024/05/22 13:02
引言
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:
生产者消费者图
存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
JAVA解决线程模型的三种方式
1、wait()和notify()
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码
2、await()和signal(),即线程锁的方式
package sort;import java.util.LinkedList;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ProducerConsumer { private LinkedList<Object> myList = new LinkedList<Object>(); private int MAX = 10; private final Lock lock = new ReentrantLock(); private final Condition full = lock.newCondition(); private final Condition empty = lock.newCondition(); public ProducerConsumer() { } public void start() { new Producer().start(); new Consumer().start(); } public static void main(String[] args) throws Exception { ProducerConsumer s2 = new ProducerConsumer(); s2.start(); } class Producer extends Thread { public void run() { while (true) { lock.lock(); try { while (myList.size() == MAX) { System.out.println("warning: it's full!"); full.await(); } Object o = new Object(); if (myList.add(o)) { System.out.println("Producer: " + o); empty.signal(); } } catch (InterruptedException ie) { System.out.println("producer is interrupted!"); } finally { lock.unlock(); } } } } class Consumer extends Thread { public void run() { while (true) { lock.lock(); try { while (myList.size() == 0) { System.out.println("warning: it's empty!"); empty.await(); } Object o = myList.removeLast(); System.out.println("Consumer: " + o); full.signal(); } catch (InterruptedException ie) { System.out.println("consumer is interrupted!"); } finally { lock.unlock(); } } } }}
3、阻塞队列的方式
import java.util.concurrent.*;public class ProducerConsumer { // 建立一个阻塞队列 private LinkedBlockingQueue<Object> queue = new LinkedBlockingQueue<Object>(10); public ProducerConsumer() { } public void start() { new Producer().start(); new Consumer().start(); } public static void main(String[] args) throws Exception { ProducerConsumer s3 = new ProducerConsumer(); s3.start(); } class Producer extends Thread { public void run() { while (true) { try { Object o = new Object(); // 取出一个对象 queue.put(o); System.out.println("Producer: " + o); } catch (InterruptedException e) { System.out.println("producer is interrupted!"); } // } } } } class Consumer extends Thread { public void run() { while (true) { try { // 取出一个对象 Object o = queue.take(); System.out.println("Consumer: " + o); } catch (InterruptedException e) { System.out.println("producer is interrupted!"); } // } } } }}
结论
三种方式原理一致,都是对独占空间加锁,阻塞和唤醒线程,第一种方式比较传统,第三种方式最简单,只需存储和取用,线程同步的操作交由LinkedBlockingQueue全权处理。
转载自:http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html
0 0
- 生产者-消费者问题【Java实现】
- 生产者-消费者问题 java实现
- java生产者消费者问题实现
- Java实现生产者消费者问题
- java实现生产者消费者问题
- 生产者消费者问题 --java实现
- Java实现生产者,消费者问题
- java实现生产者消费者问题
- java实现生产者消费者问题
- java实现生产者消费者问题
- java实现生产者消费者问题
- 生产者消费者问题、Java实现
- 生产者/消费者问题java实现
- java实现生产者消费者问题
- java实现生产者消费者问题
- Java实现生产者--消费者问题
- java实现生产者消费者问题
- Java 实现生产者消费者问题
- 交叉编译opencv2.31与移植至arm9
- Number Sequence
- 阿牛的EOF牛肉串
- java 常见问题 之 异常处理不彻底
- 用移动硬盘安装CentOS 6.5
- java实现生产者消费者问题
- 直方图匹配方法
- poj2054(贪心)
- 使用法国SOLEN电容有感
- [Vim]UTF-8乱码问题
- [Leetcode] Same Tree (Java)
- Mini2440移植qt-extended4.4.3
- 交叉编译opencv2.31与移植至arm9
- 算法导论9-2-c-带权中位数