zoukankan      html  css  js  c++  java
  • java多线程 生产者消费者模式

    package de.bvb;
    
    /**
     * 生产者消费者模式
     * 通过  wait() 和 notify() 通信方法实现
     *
     */
    public class Test1 {
        public static void main(String[] args) {
            Godown godown = new Godown(50);
            for (int i = 0; i < 5; i++) {
                new ProducerThread(i * 10, godown).start();
                new ConsumerThread(i * 10, godown).start();
            }
        }
    }
    
    /** 仓库 */
    class Godown {
        public static final int max_size = 100; // 最大库存量
        public int currentSize; // 当前库存
    
        public Godown(int currentSize) {
            this.currentSize = currentSize;
        }
    
        // 生产指定数量的产品
        public synchronized void produce(int size) {
            try {
                while (currentSize + size > max_size) { // 不满足生产的条件
                    System.out.println("要生产的产品数量" + size + "超过剩余库容量"
                            + (max_size - currentSize) + ",暂时不能执行生产任务!");
                    // 当前的生产线程等待
                    wait();
                }
                // 满足生产条件,则进行生产,这里简单的更改当前库存量
                currentSize += size;
                System.out.println("生产前仓储量为:" + (currentSize - size) + ";生产了"
                        + size + "个产品,现仓储量为" + currentSize);
                // 唤醒在此对象监视器上等待的所有线程
                notifyAll();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // 消费指定数量的产品
        public synchronized void consume(int size) {
            try {
                while (currentSize < size) { // 不满足消费的条件
                    System.out.println("要消费的产品数量" + size + "超过剩余库存量"
                            + (currentSize) + ",暂时不能执行消费任务!");
                    // 当前的生产线程等待
                    wait();
                }
                // 满足生产条件,则进行生产,这里简单的更改当前库存量
                currentSize -= size;
                System.out.println("消费前的仓储量为" + (currentSize + size) + ";已经消费了"
                        + size + "个产品,现仓储量为" + currentSize);
                // 唤醒在此对象监视器上等待的所有线程
                notifyAll();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    /** 生产者线程 */
    class ProducerThread extends Thread {
        private int size;
        private Godown godown;
    
        public ProducerThread(int size, Godown godown) {
            super();
            this.size = size;
            this.godown = godown;
        }
    
        @Override
        public void run() {
            godown.produce(size);
        }
    }
    
    class ConsumerThread extends Thread {
        private int size;
        private Godown godown;
    
        public ConsumerThread(int size, Godown godown) {
            super();
            this.size = size;
            this.godown = godown;
        }
    
        @Override
        public void run() {
            godown.consume(size);
        }
    }
  • 相关阅读:
    MUI-页面传参数
    Spring-boot:多模块打包
    PythonDay11
    PythonDay10
    PythonDay09
    PythonDay08
    PythonDay07
    PythonDay06
    PythonDay05
    PythonDay04
  • 原文地址:https://www.cnblogs.com/Westfalen/p/6230403.html
Copyright © 2011-2022 走看看