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