今天在学习线程的时候接触到消费者和生产者模式,写了简单的代码
2016-08-28 22:26
447 查看
package javaluange2; import java.util.LinkedList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ConsumerProducer { private static Buffer buffer = new Buffer(); public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(new ProducerTask()); executor.execute(new ConsumerTask()); executor.shutdown(); } /** * 生产者 * * @author baqy * */ private static class ProducerTask implements Runnable { @Override public void run() { try { int i = 1; while (true) { System.out.println("\t\tProducer writes " + i); buffer.write(i++); Thread.sleep((int) (Math.random() * 10000) ); } } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 消费者 * * @author baqy * */ private static class ConsumerTask implements Runnable { @Override public void run() { try { while (true) { System.out.println("\t\tConsumer reads " + buffer.read()); Thread.sleep((int) (Math.random() * 10) + 1); } } catch (InterruptedException e) { e.printStackTrace(); } } } private static class Buffer { private static final int CAPACITY = 1; private LinkedList<Integer> queue = new LinkedList<Integer>(); private static Lock lock = new ReentrantLock();// create a lock // create two conditions private static Condition NotEmpty = lock.newCondition(); private static Condition NotFull = lock.newCondition(); public int read() { int value=0; lock.lock(); try { //当队列中为空时等待 while (queue.isEmpty()) { System.out.print("wait for notEmpty condition"); NotEmpty.await(); } //不为空的时候读取对首元素 value= queue.remove(); NotFull.signal();//唤醒notFull 条件 } catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); return value; } } public void write(int value) { lock.lock(); try { while (queue.size() == CAPACITY) {// 容量已满 System.out.print("\t\twait for not full condition"); NotFull.await(); } //容量不满时在队列中添加到队尾 queue.offer(value); //唤醒notEmpty 条件 NotEmpty.signal(); } catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } } }
这个例子假设缓冲区存储整数,大小也是受限的,缓冲区提供了write(),read(),在写入缓冲区的时候判断大小是否已经满了,就让线程处于等待,消费也是判断缓冲区是否为空,空就等待。这就是两个条件,通过Lock创建出来的,队列是用链表生成的,在队尾生产,队首消费,在满足添加之后唤醒消费者,消费者也是一样,消费完了唤醒生产者。
相关文章推荐
- Java线程(学习整理)--4---一个简单的生产者、消费者模型
- [知了堂学习笔记]_线程通信(生产者和消费者模式)
- 描述消费者和生产者模式的代码(有些公司面试的时候会让你直接写一段代码)
- 线程经典代码三,(循环缓冲区,生产者/消费者关系)
- 每天学习一算法系列(31)(实现一个队列,队列的应用场景为:一个生产者线程将int 类型的数入列,一个消费者线程将int 类型的数出列)
- 线程:生产者与消费者模式
- JAVA生产者消费者(线程同步)代码学习示例
- 学习和理解JAVA线程同步--生产者与消费者例子
- (转)一段生产者和消费者的简单多线程代码
- Java基础学习__多线程(线程间通信--生产者消费者JDK5.0升级版)
- .net网站中的跨进程调用学习(生产者和消费者模式)
- 学习和理解JAVA线程同步--生产者与消费者例子
- Java线程(三):线程协作-生产者/消费者模式
- Java线程(三):线程协作-生产者/消费者模式
- 【设计模式】java生产者和消费者的代码实例
- 线程经典代码一,(未同步情况下的生产者/消费者关系)
- 多线程---使用ManualResetEvent来控制线程间的同步(实现了消费者和生产者模式)
- Java- 简单了解线程 生产者与消费者问题(三)
- Java线程(三):线程协作-生产者/消费者模式
- 线程协作-生产者/消费者模式