生产者消费者

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

 

posted @ 2017-07-17 18:57  it-achy  阅读(169)  评论(0)    收藏  举报