使用Lock和Condition实现生产者消费者模型

public class Storage {
    
    //仓库最大存储量
    private int MAX_SIZE;
    //仓库存储的载体
    private LinkedList list = new LinkedList<>();
    //锁
    private final Lock lock = new ReentrantLock();
    //“仓库满”的条件变量
    private final Condition produceCondition = lock.newCondition();
    //“仓库空”的条件变量
    private final Condition consumeCondition = lock.newCondition();
    
    public Storage(int maxSize) {
        this.MAX_SIZE = maxSize;
    }
    
    /**
     * 生产num个产品
     * @param num
     */
    public void produce(int num) {
        
        //获取锁
        lock.lock();
        
        //剩余空位置不足
        while(list.size() + num >= MAX_SIZE) {
            
            System.out.println("【要生产的产品数量】:" + num + "\t【库存量】:" + list.size()  
             + "\t【剩余空间】:" + (MAX_SIZE - list.size()) + "\t暂时不能执行生产任务!"); 
            
            try {
                //没法生产,先阻塞
                produceCondition.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        //剩余空间足够,生产num个产品
        for(int i = 0; i < num; ++i) {
            list.addLast(new Object());
        }
        System.out.println("【本次生产产品数】:" + num + "\t【当前库存为】:" + list.size()); 
        
        //唤醒所有消费者线程
        consumeCondition.signalAll();
        //解锁
        lock.unlock();
    }
    
    /**
     * 消费num个产品
     * @param num
     */
    public void consume(int num) {
        
        //获得锁
        lock.lock();
        
        //如果仓库存储量不够num个,本次消费阻塞
        while(list.size() < num) {
            
            System.out.println("【要消费的产品数量】:" + num + "\t【库存量】:" + list.size()  
            + "\t暂时不能执行消费任务!");  
            
            try {
                //没法消费,阻塞
                consumeCondition.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        //库存足够本次消费,消费num个产品
        for(int i = 0; i < num; ++i) {
            list.removeFirst();
        }
        System.out.println("【本次消费产品数】:" + num + "\t【当前库存为】:" + list.size());
        
        //消费完了,唤醒所有生产者线程
        produceCondition.signalAll();
        //释放锁
        lock.unlock();
    }
        
}







你可能感兴趣的:(使用Lock和Condition实现生产者消费者模型)