生产者消费者模型(使用lock.condition进行分组唤醒)
2017-05-24 23:19
441 查看
使用concurrent包完成生产者消费者模型,使用lock.condition进行分组唤醒,摒弃synchonized中的sinalAll(),代码如下:
import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Myservice{ Queue<Integer> arrque = new ArrayBlockingQueue<Integer>(100); Lock lock = new ReentrantLock(); Condition condition_pro = lock.newCondition(); Condition condition_con = lock.newCondition(); // 生产者方法 void produce(){ try { lock.lock(); while(arrque.size()==100){// 因为使用了分组唤醒,用if while都可以 System.out.println("我是生产者"+Thread.currentThread().getName()+",我被阻塞了"); condition_pro.await(); } int random = (int)(Math.random()*10000); System.out.println(Thread.currentThread().getName()+"生产了一条消息"+random); arrque.offer(random); if(arrque.size()==1){ condition_con.signalAll();// 唤醒所有消费者 } } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unlock(); } } // 消费者方法 void consume(){ try { lock.lock(); while(arrque.isEmpty()){// 因为使用了分组唤醒,用if也都可以 System.out.println("*****我是消费者"+Thread.currentThread().getName()+",我被阻塞了"); condition_con.await();// 消费者自己阻塞自己 } System.out.println("*****"+Thread.currentThread().getName()+"消费了队头元素"+arrque.peek()); arrque.poll(); if(arrque.size()==100-1){// 并不是每消费一条消息就唤醒一次生产者 condition_pro.signalAll(); } } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unlock(); } } } // 生产者线程 class produceThread implements Runnable { Myservice ser; public produceThread(Myservice ser) { this.ser = ser; } public void run(){ try { while(true){ Thread.sleep(1000); ser.produce(); } } catch (InterruptedException e) { e.printStackTrace(); } } } // 消费者线程 class consumerThread implements Runnable { Myservice ser; public consumerThread(Myservice ser) { this.ser = ser; } public void run(){ try { while(true){ Thread.sleep(3000); ser.consume(); } } catch (InterruptedException e) { e.printStackTrace(); } } } // 客户端程序 public class Myservice_pro_con{ public static void main(String[] args){ Myservice ser = new Myservice(); produceThread producer = new produceThread(ser); consumerThread consumer = new consumerThread(ser); // 如果调用20次生产者方法而不是开启20个生产者线程,那生产者执行完后消费者才能执行,生产者不能和消费者并行 /*for(int i=0;i<20;i++){ ser.produce(); }*/ // 创建proNum个生产者线程 int proNum=20; int conNum=20; Thread[] proArr = new Thread[proNum]; for(int i=0;i<proNum;i++){ proArr[i]=new Thread(producer); } // 创建conNum个消费者线程 Thread[] conArr = new Thread[conNum]; for(int i=0;i<conNum;i++){ conArr[i]=new Thread(consumer); } for(int i=0;i<proNum;i++){ proArr[i].start(); } for(int i=0;i<conNum;i++){ conArr[i].start(); } } }
相关文章推荐
- 使用ReentrantLock和Condition实现生产者消费者模型
- 使用Lock和Condition实现生产者消费者模型
- 多线程--生产者消费者范例,使用lock和condition
- 生产者消费者模型(多个生产者和多个消费者)JDK1.5 (Lock&Condition)实现版
- 使用 Lock 与Condition 实现生产者消费者
- 线程间通信、等待唤醒机制、生产者消费者问题(Lock,Condition)、停止线程和守护线程、线程优先级
- 使用JUC并发工具包的Lock和Condition,实现生产者和消费者问题中的有界缓存
- 使用lock&condition实现生产者消费者
- 使用Lock和Condition实现生产者和消费者
- 使用Lock的Condition实现生产者消费者
- Lock、Condition实现简单的生产者消费者模式示例
- 生产者与消费者模型(数据重复取出解决办法:休眠与唤醒方法 wait notify)
- 精通Java多线程学习(五)用Lock和condition实现生产者与消费者
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
- 使用swoole的Process实现生产者消费者模型
- java中重入ReentrantLock(Condition监视器)锁生产者消费者
- 使用swoole的Process实现生产者消费者模型
- Linux多线程消费者和生产者模型实例(互斥锁和条件变量使用)
- 使用Lock来实现生产者和消费者问题
- Java多线程之~~~~使用wait和notify实现生产者消费者模型