zoukankan      html  css  js  c++  java
  • 设计模式生产者消费者模式

    /**
    * 生产者(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();
            }
        }
    }


  • 相关阅读:
    UIScrollView设置滑动的距离
    iOS动画效果和实现
    cmd 编码 utf8
    详细的ifcfg-eth0配置详解
    Centos下 Nginx安装与配置
    linux安装目录
    utf8 和 UTF-8 的区别
    后台添加搜索功能讲解
    移动端 禁横向滚动
    PC端 $_SERVER 说明
  • 原文地址:https://www.cnblogs.com/wsZzz1997/p/14641573.html
Copyright © 2011-2022 走看看