使用ReentrantLock+Condition实现的单个生产者多个消费者模式

  • 代码如下
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 场景介绍:
 *  一个生产者  120个消费者
 *  生产者生产目标是100个,到了100个就不生产了;同时生产者在存在可以卖的茶大于5个同时已经生产了大于10个的情况下可以休息,然后等待消费者的唤醒
 *  消费者只要有茶叶都可以买,没有茶叶可以唤醒生产者,然后等待生产,除非生产者已经生产了100个而且卖完了,消费者才会推出,打印没有买到
 * @Description 生产者和消费者使用同一把锁
 */
public class TestProducerAndConsumer {
   
    //目标只生产100袋茶叶
    private static transient int targerTeas = 100;
    //已经生产的茶叶袋数
    private static transient AtomicInteger produced = new AtomicInteger(0);
    //出去卖出的茶叶还剩余的茶叶数量
    private static transient AtomicInteger exist = new AtomicInteger(0);
    //卖出去多少袋
    private static transient AtomicInteger sell = new AtomicInteger(0);


    public static void main(String[] args) {
   
        Lock lock = new ReentrantLock();
        Condition producer = lock.newCondition();
        Condition consumer = lock.newCondition();

        //生产者
        Runnable producerTask = () -> {
   
            lock.lock();
            try {
   
                while (produced.intValue() < targerTeas) {
   
                    if (exist.intValue() > 5 && produced.intValue() > 10) {
   
                        consumer.signalAll();
                        producer.await();
                    }
                    Thread.sleep(1000L);
                    produced.incrementAndGet();
                    exist.incrementAndGet();
                    System.out.println("====================生产了" + produced.intValue() + "个");
                }
                System.out.println("已经生产了100个  不卖了  只卖100个!!!!!!!!!!!!!!!!!!!!");
                consumer.signalAll();
            } catch (Exception e) {
   

            } finally {
   
                lock.unlock();
            }
        };

        //消费者
        Runnable consumerTask = () -> {
   
            lock.lock();
            try {
   
                while (exist.intValue() <= 0) {
   
                    if (produced.intValue() == targerTeas && exist.intValue() <= 0) {
   
                        System.out.println("沒有了  今天不卖了" + Thread.currentThread().getName() + "没有买到");
                        throw new RuntimeException();
                    }
                    producer.signal();
                    consumer.await();
                }
                exist.decrementAndGet();
                sell.incrementAndGet();
                System.out.println(Thread.currentThread().getName() + "买了茶;卖了第" + sell.intValue() + "袋茶叶");
            } catch (Exception e) {
   

            } finally {
   
                lock.unlock();
            }
        };

        System.out.println("开始买卖!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        new Thread(producerTask).start();
        for (int i = 1; i < 121; i++) {
   
            new Thread(consumerTask, "第" + i + "个买主").start();
        }
    }
}
  • 执行结果
"C:\Program Files\Java\jdk1.8.0_231\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51308,suspend=y,server=n -javaagent:C:\Users\14806\AppData\Local\JetBrains\IntelliJIdea2021.2\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_231\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\access-bridge-6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值