zoukankan      html  css  js  c++  java
  • 生产者消费者

    package com.charles.algorithm;
    
    public class ConsumerProducer {
        /**
         * @desc: single object implements producer and consumer by array
         */
        private final static int SIZE = 10;
        private int head = 0, tag = 0, count = 0;
        private Object[] items = new Object[SIZE];
    
        public static void main(String[] args) {
    
            // define 5 producers
            ConsumerProducer conducer = new ConsumerProducer();
            for (int i = 0; i < SIZE/2; i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (true) {
                            conducer.produce();
                        }
                    }
                }).start();
            }
            // define 3 consumers
            for (int i = 0; i < SIZE/3; i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (true) {
                            conducer.consume();
                        }
                    }
                }).start();
            }
        }
    
        public synchronized void produce() {
            while (isFull()) {
                try {
                    System.out.println("生产者-"+Thread.currentThread().getName() + " 已满:" + count +" 等代销费者");
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            items[tag++] = true;
            count++;
            if (tag == items.length) {
                tag = 0;
            }
            this.notifyAll();
            try {
                System.out.println("生产者-"+Thread.currentThread().getName() + " 生产一个,剩余" + count);
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public synchronized void consume() {
            while (isEmpty()) {
                try {
                    System.out.println("消费者-"+Thread.currentThread().getName() + " 已空:" + count+" 等代生产者");
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            items[head] = null;
            head++;
            count--;
            if (head == items.length) {
                head = 0;
            }
            this.notifyAll();
            try {
                System.out.println("消费者-"+Thread.currentThread().getName() + " 消费一个,还有" + count);
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        private boolean isFull() {
            return count == items.length;
        }
    
        private boolean isEmpty() {
            return 0 == count;
        }
    }
  • 相关阅读:
    Tampermonkey 油猴脚本开发 入门
    k8s 上安装 lamp 环境
    centOS 7.9 k8s 安装 和 基本命令
    力扣59-螺旋矩阵 II
    力扣54-螺旋矩阵
    力扣705-设计哈希集合
    力扣706-设计哈希映射
    scrapy参数-COOKIES_ENABLED
    优雅降级、渐进增强
    e-cahr的地图组件封装(浙江省为例)
  • 原文地址:https://www.cnblogs.com/itachy/p/7197047.html
Copyright © 2011-2022 走看看