• 设计模式生产者消费者模式


    /**
    * 生产者(Productor)将产品交给店员(Clerk),消费者(Customer)从店员取走产品
    * 店员只能持有固定的数目产品(例如:20
    * 如果店员的产品满了,会通知生产者停一下。
    * 如果店员的产品没了,会通知消费者等一下。
    * 是多线程问题,多个消费者,多个生产者,共享数据是产品和店员
    *
    
    
    /**
     * 店员
     */
    class Clerk{
        // 产品数量
        private int productCount = 0;
    
        /**
         * 生产产品
         */
        public synchronized void produceProduct() {
            if(productCount<20){
                productCount++;
                System.out.println(Thread.currentThread().getName()+"生产产品,目前产品数:"+productCount);
    
                // 生产完就唤醒消费者
                notify();
            }else{
                // 等待
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public synchronized void consumeProduct() {
            if(productCount>0){
                System.out.println(Thread.currentThread().getName()+"消费产品,目前产品号:"+productCount);
                productCount--;
    
                // 消费完就唤醒生产者
                notify();
    
            }else{
                // 等待
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     *生产者
     */
    class Producer extends Thread{
        private Clerk clerk;
    
        public Producer(Clerk clerk) {
            this.clerk = clerk;
        }
    
        @Override
        public void run() {
            System.out.println(getName()+"开始生产产品...");
            while(true){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                clerk.produceProduct();
            }
        }
    }
    /**
     * 消费者
     */
    class Consumer extends Thread{
        private Clerk clerk;
    
        public Consumer(Clerk clerk) {
            this.clerk = clerk;
        }
    
        @Override
        public void run() {
            System.out.println(getName()+"开始消费产品....");
            while(true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                clerk.consumeProduct();
            }
        }
    }


  • 相关阅读:
    markdown 书写文档的框架
    使用snap
    如何让pandas表格直接转换为markdown表格
    我们需要怎样去写博客
    jupyter notebook 远程访问
    安装tensorflowGPU版本
    Data Science Project
    使用python处理地理数据:Geopandas
    python移植环境
    Jupyter notbook& REVEAL.JS& nbconvert 使用jupyter notebook制作slides
  • 原文地址:https://www.cnblogs.com/wsZzz1997/p/14641573.html
Copyright © 2020-2023  润新知