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;
        }
    }
  • 相关阅读:
    HTML
    Java 1.8 新特性
    Java 反射
    子网与超网
    Java 网络编程
    Java 单例模式、枚举
    Java 线程生命周期、线程池
    Java 多线程
    Java Properties、流对象关闭格式
    基础练习 十六进制转八进制
  • 原文地址:https://www.cnblogs.com/itachy/p/7197047.html
Copyright © 2011-2022 走看看