线程基础(三)
ProducerConsumer
package org.wp.thread;public class ProducerConsumer {public static void main(String args[]) {SyncStack ss = new SyncStack();Producer prod = new Producer(ss);Consumer cons = new Consumer(ss);new Thread(cons).start();new Thread(prod).start();}}class Vinegar {Integer id;Vinegar(Integer id) {this.id = id;}@Overridepublic String toString() {return "Vinegar:" + id;}}class SyncStack {Integer index = 0;Vinegar[] arrVinegar = new Vinegar[6];public synchronized void produce(Vinegar vin) {while (index == arrVinegar.length) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.notify();arrVinegar[index] = vin;System.out.println("生产了:" + vin);index++;}public synchronized void consume() {while (index == 0) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.notify();index--;System.out.println("消费了:" + arrVinegar[index]);}}class Producer implements Runnable {SyncStack ss = null;Producer(SyncStack ss) {this.ss = ss;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {Vinegar vin = new Vinegar(i);ss.produce(vin);try {Thread.sleep((int) (Math.random() * 100));} catch (InterruptedException e) {e.printStackTrace();}}}}class Consumer implements Runnable {SyncStack ss = null;Consumer(SyncStack ss) {this.ss = ss;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {ss.consume();try {Thread.sleep((int) (Math.random() * 1000));} catch (InterruptedException e) {e.printStackTrace();}}}}