java线程(四)生产者消费者
下面是尚学堂的一个生产者消费者的例子: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;public synchronized void push(WoTou wt) {while(index == arrWT.length) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.notifyAll();arrWT = wt;index ++;}public synchronized WoTou pop() {while(index == 0) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.notifyAll();index--;return arrWT;}}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();}}}}
调用wait方法的时候必须锁定对象,wait是Object的方法。像上面的代码一样,如果生产多了,这个线程就停止,直到有一个线程去叫醒他(this.notifyAll())。wait和sleep的区别就是,wait的时候相当于把这个锁放开了,别人可以去调用我这个对象。但是sleep就不行,他虽然sleep了,但是还是锁定这个对象,别人无法去调用。
页:
[1]