package com.ixhong.base.thread.base;

public class ProducerConsumer {
public static void main(String[] args) {
SyncStack ss = new SyncStack();

new Thread(new Producer(ss, "p1")).start();
new Thread(new Consumer(ss, "c1")).start();
new Thread(new Producer(ss, "p2")).start();
new Thread(new Consumer(ss, "c2")).start();
}
}

class WoTou {
private int id;

public WoTou(int id) {
this.id = id;
}

public int getId() {
return id;
}

public String toString() {
return "WT" + getId();
}
}

class SyncStack {
private int index = 0;
private WoTou[] arrWT = new WoTou[6];

public synchronized void push(WoTou wt) {
while (index == arrWT.length) {
try {
this.wait();
} catch (InterruptedException e) {}
}
this.notifyAll();
arrWT[index++] = wt;
}

public synchronized WoTou pop() {
while (index == 0) {
try {
this.wait();
} catch (InterruptedException e) {}
}
this.notifyAll();
return arrWT[--index];
}
}

class Producer implements Runnable {
private SyncStack ss = null;
private String name;

public Producer(SyncStack ss, String name) {
this.ss = ss;
this.name = name;
}

public String getName() {
return name;
}

public void run() {
for (int i = 0; i < 60; i++) {
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println(getName() + "生产" + wt);
try {
Thread.sleep((long) (Math.random() * 100));
} catch (InterruptedException e) {}
}
}
}

class Consumer implements Runnable {
private SyncStack ss = null;
private String name;

public Consumer(SyncStack ss, String name) {
this.ss = ss;
this.name = name;
}

public String getName() {
return name;
}

public void run() {
for (int i = 0; i < 60; i++) {
WoTou wt = ss.pop();
System.out.println(getName() + "消费" + wt);
try {
Thread.sleep((long) (Math.random() * 400));
} catch (InterruptedException e) {}
}
}
}