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();
            }
        }
    }


  • 相关阅读:
    Java并发编程:线程池的使用
    多线程笔记
    《Java源码解析》之NIO的Selector机制(Part1:Selector.open())
    git reset --hard 和 git reset --sort区别
    java 泛型
    01springboot简介
    Selector 实现原理
    -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable
    activemq使用
    8年javascript总结
  • 原文地址:https://www.cnblogs.com/wsZzz1997/p/14641573.html
Copyright © 2011-2022 走看看