zoukankan      html  css  js  c++  java
  • 【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流水账公众号
  • 相关阅读:
    用ildasm和ilasm对.net下的exe程序进行破解初探
    随笔--各种概念等等
    C#高级编程学习一-----------------第五章泛型
    visual studio相关操作
    webservice开发
    delphi各种错
    android开发文章收藏
    android开发遇到的问题
    android应用开发基础知道
    数据库各种问题
  • 原文地址:https://www.cnblogs.com/guofu-angela/p/10867205.html
Copyright © 2011-2022 走看看