第九章 Java多线程机制 05_线程同步_7_生产者消费者问题
鱼欲遇雨:每日都学习一点,持之以恒,天道酬勤!不能用电脑时,提前补上!(2012.9.3)
模拟消费者和生产者之间的关系
示例代码:(线程的核心)
// ProducerConsumer.java//import java.util.Math;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(c).start();}}class WoTou {int id;WoTou(int id) {this.id = id;}public String toString() {return ("WoTou: " + id);}}class SyncStack {int index;WoTou[] arrWT = new WoTou[6];public synchronized void push(WoTou wt) {while(index == 6) {try{this.wait(); //执行当前对象的线程等待;必须有锁定才能wait();wait()不在锁定}catch (InterruptedException e){e.printStackTrace();}}this.notify(); //叫醒当前等待的线程arrWT[index] = wt;index ++;}public synchronized WoTou pop() {while(index == 0) {try{this.wait();}catch (InterruptedException e){e.printStackTrace();}}this.notify();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 < 20; i ++) {WoTou wt = ss.pop();System.out.println("消费了: " + wt);try{Thread.sleep((int)(Math.random() * 1000));}catch (InterruptedException e){e.printStackTrace();}}}}