直接上代码
public class Test{//测试类
public static void main(String[] args) {
Plate plate = new Plate();//所有的线程公用的对象(盘子)
Producer producer = new Producer(plate);
Producer producer2 = new Producer(plate);
Consumer consumer = new Consumer(plate);
Thread thread01 = new Thread(producer);
Thread thread03 = new Thread(producer2);
Thread thread02 = new Thread(consumer);
thread01.start();
//thread03.start();
thread02.start();
}
}
class Plate {//盘子(存放包子)
private Vector<String> steameds = new Vector<String>();//包子(Vector线程安全,如果用LinkedList,运行过程中会报错)
static int num=0;//包子数量
private boolean flag=false;//是否有消费者等待
public void producer(String product){//生产包子
try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}//模拟生产包子时间
steameds.add(product);//向盘子里放包子
num++;
System.out.println("生产了一个包子,还剩"+num+"个包子");
//看是否有消费者等待,有责唤醒他们
if(flag){
flag=false;
System.out.println("生产了包子,通知等待的吃包子");
synchronized(this){
this.notifyAll();//唤醒等待中的消费者
}
}
}
public synchronized void consumer(){//吃掉包子
//开始池包子
try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}//模拟吃包子时间
if(steameds.isEmpty()){//没有包子,则等待
flag = true;
System.out.println("没包子了,等待。。。。");
try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}
}else{//有包子则吃
steameds.remove(0);
num--;
System.out.println("吃完一个包子,还剩"+num+"个包子");
}
}
}
class Producer implements Runnable{//生产者
private Plate p;
public Producer(Plate p){
this.p = p;
}
public void run() {
for(int i=1;i<100;i++){
p.producer("包子"+i);//生产者生产包子
}
}
}
class Consumer implements Runnable{//消费者
private Plate p;
public Consumer(Plate p){
this.p = p;
}
public void run() {
for(int i=1;i<100;i++){
p.consumer();//消费者吃包子
}
}
}
以上代码就是个生产者消费者模式的代码,通过标记法,标记符flag为true时,有消费者等待,生产者生产好东西后唤醒消费者消费,flag为false时,没有消费者等待,同时通过盘子里包子的数量,判断消费者是否等待。。。。。
网友评论