经典的生产者消费者模型(二)

来源:互联网 发布:情侣礼物知乎 编辑:程序博客网 时间:2024/05/22 14:49
package com.zzj.concurrency;import java.util.LinkedList;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ProducerConsumerModel2 {private final LinkedList<String> queue = new LinkedList<>(); private final int max = 3;private Lock lock = new ReentrantLock();private Condition producer = lock.newCondition();private Condition consumer = lock.newCondition();public void put(String e) {try {lock.lock();while(queue.size() == max){ // 此处不能用if判断producer.await();}queue.add(e);consumer.signalAll(); // 通知消费者消费} catch (InterruptedException e1) {e1.printStackTrace();} finally {lock.unlock();}}public String get(){String r = null;try {lock.lock();while(queue.size() == 0){ // 此处不能用if判断consumer.await();}r = queue.removeFirst();producer.signalAll(); // 通知生产者生产} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}return r;}public static void main(String[] args) {final ProducerConsumerModel2 model = new ProducerConsumerModel2();// 启动5生产者for (int i = 0; i < 5; i++) {new Thread(new Runnable() {public void run() {for(int j = 0; j < 10; j++){model.put(Thread.currentThread().getName() + "-" + j);}}}, "producer-" + i).start();}// 启动10消费者for (int i = 0; i < 10; i++) {new Thread(new Runnable() {public void run() {for(int j = 0; j < 5; j++){System.out.println(model.get());}}}, "consumer-" + i).start();}}}

输出结果:

producer-0-0producer-3-0producer-3-1producer-3-2producer-3-3producer-0-1producer-3-4producer-4-0producer-4-1producer-4-2producer-1-0producer-1-2producer-1-1producer-1-3producer-3-5producer-3-6producer-0-2producer-4-3producer-4-4producer-4-5producer-1-4producer-1-6producer-1-5producer-1-7producer-0-3producer-3-7producer-0-4producer-4-6producer-1-8producer-1-9producer-3-8producer-0-5producer-2-0producer-3-9producer-0-6producer-0-7producer-0-8producer-0-9producer-2-1producer-2-2producer-2-3producer-4-8producer-4-9producer-2-4producer-4-7producer-2-5producer-2-6producer-2-7producer-2-8producer-2-9




原创粉丝点击