public class ProducerConsumer { public static void main(String[] args) { SyncStack ss = new SyncStack(); Producer p = new Producer(ss); Consumer c = new Consumer(ss); new Thread(p).start(); new Thread(p).start(); new Thread(p).start(); new Thread(c).start(); } } class WoTou { int id; WoTou(int id) { this.id = id; } public String toString() { return "WoTou : " + id; } } class SyncStack { int index = 0; WoTou[] arrWT = new WoTou[6]; public synchronized void push(WoTou wt) {//同步控制,只允许独立进行 while (index == arrWT.length) { //控制数量,不能超过可以承受的最大数量 try { this.wait(); //当前访问的synchronized型线程wait,锁让给其他线程 } catch (InterruptedException e) { e.printStackTrace(); } } //如果不叫醒则会产生死锁 // this.notify(); //叫醒一个当前对象正在wait的线程 this.notifyAll(); arrWT[index] = wt; index++; } public synchronized WoTou pop() { //同步控制,只允许独立进行 while (index == 0) { //用if,如果catch到异常则会退出等待,继续执行 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); index--; return arrWT[index]; } } class Producer implements Runnable { //生产者进程 SyncStack ss = null; Producer(SyncStack ss) { this.ss = ss; } public void run() { for (int i = 0; i < 20; i++) { WoTou wt = new WoTou(i); ss.push(wt); System.out.println("生产了:" + wt); try { Thread.sleep((int) (Math.random() * 200)); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer implements Runnable { //消费者进程 SyncStack ss = null; Consumer(SyncStack ss) { this.ss = ss; } public void run() { for (int i = 0; i < 60; i++) { WoTou wt = ss.pop(); System.out.println("消费了: " + wt); try { Thread.sleep((int) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } } } }