• 【Java基础】生产者消费者模式


    很多项目后台逻辑实际上就是生产者消费者的关系,实现生产者消费者的方式有很多中,去泰国每天要喝至少三杯芒果冰沙,就拿制作芒果冰沙为例子,商家是生产者,我是消费者,可能同时有很多个消费者,1.要保证生产的芒果冰沙有柜台可以放的下,设置最大能放100杯;2.当柜台上芒果冰沙数为0时,消费者需要等待:

    /**
     * Created by zw on 2019/5/15.
     * 存放芒果冰沙
     */
    public class Storage {
    
        private final int MAX_SIZE = 100;
    
        private LinkedList<MangoIce> mangoIceLinkedList = new LinkedList<>();
    
        public void produce(){
            synchronized (mangoIceLinkedList){
                //如果仓库满了
                if(mangoIceLinkedList.size() + 1 > MAX_SIZE){
                    try {
                        mangoIceLinkedList.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else {
                    mangoIceLinkedList.add(new MangoIce());
                    System.out.println("【目前剩余的冰沙数】:" + mangoIceLinkedList.size());
                    mangoIceLinkedList.notifyAll();
                }
    
            }
        }
    
        public void consume(){
            synchronized (mangoIceLinkedList){
                //如果仓库为空 不用消费
                if(mangoIceLinkedList.size() == 0){
                    try {
                        mangoIceLinkedList.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else {
                    mangoIceLinkedList.remove();
                    System.out.println("【目前消费后的冰沙数】:" + mangoIceLinkedList.size());
                    mangoIceLinkedList.notifyAll();
                }
            }
        }
    
        public static void main(String[] args) {
            Storage storage = new Storage();
            Producer producer = new Producer(storage);
            Producer producerB = new Producer(storage);
            Producer producerC = new Producer(storage);
            Producer producerD = new Producer(storage);
            Producer producerE = new Producer(storage);
            Consumer consumer = new Consumer(storage);
            Consumer consumerB = new Consumer(storage);
    
            producer.start();
            consumer.start();
            producerB.start();
            consumerB.start();
            producerC.start();
            producerD.start();
            producerE.start();
        }
    }
    
    /**
     * Created by zw on 2019/5/15.
     * 生产者
     */
    public class Producer extends Thread{
        private Storage storage;
    
        public Producer(Storage storage){
            this.storage = storage;
        }
    
        @Override
        public void run() {
            storage.produce();
        }
    }
    
    /**
     * Created by zw on 2019/5/15.
     * 消费者
     */
    public class Consumer extends Thread {
        private Storage storage;
    
        public Consumer(Storage storage){
            this.storage = storage;
        }
    
        @Override
        public void run() {
            storage.consume();
        }
    }
    欢迎关注Java流水账公众号
  • 相关阅读:
    JAVA-初步认识-第十三章-验证静态同步函数的锁
    JAVA-初步认识-第十三章-多线程(验证同步函数的锁)
    JAVA-初步认识-第十二章-面向对象(包与包之间的访问)
    JAVA-初步认识-第十二章-面向对象(包的概述)
    JAVA-初步认识-第十三章-同步函数
    Fatal error: Call to undefined function imagettftext()解决办法
    ecstore菜鸟电子面单对接摘要
    linux crontab 实现每秒执行(转)
    ios9 URL Schemes列为白名单,才可正常检查其他应用是否安装
    主机宝等主机面板不能跨站访问文件,不能访问父路径文件问题
  • 原文地址:https://www.cnblogs.com/guofu-angela/p/10867205.html
Copyright © 2020-2023  润新知