多线程之:生产者消费者

来源:互联网 发布:淘宝网店客服怎么设置 编辑:程序博客网 时间:2024/05/22 14:31
一直纠结与生产和消费完后为什么要sleep(),现在终于搞明白了,把代码贴出

package com.mhm.test;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 = 0;WoTou[] arrWT = new WoTou[2];public synchronized void push(WoTou wt) {while(index == arrWT.length) {try {System.out.println("生产已满,等待消费");this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.notifyAll();arrWT[index] = wt;index ++;}public synchronized WoTou pop() {while(index == 0) {try {System.out.println("消费已完,等待生产");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() {WoTou wt = null;for(int i=0; i<20; i++) {wt = new WoTou(i);ss.push(wt);System.out.println("生产了:" + wt);//如果没有sleep(),那么,打印会跟不上另一个线程执行的速度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);//如果没有sleep(),那么,打印会跟不上另一个线程执行的速度try {Thread.sleep((int)Math.random() * 1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
原创粉丝点击