生产消费模式

来源:互联网 发布:vb中instr什么意思 编辑:程序博客网 时间:2024/04/28 00:14

package com.phone.week5.day3;
/**
* 有一个仓库放字符的,它有一个生产字符的方法,也有一个拿字符的方法(仓库里只能有一个字符)
* 有一个生产者,可以调用仓库里生产字符的方法
* 有一个消费者,可以调用仓库里拿字符的方法
* 两个人不能同时生产或拿
*1.创建一个共享资源类
*2.创建生产者
*3.创建消费者
*5.测试
*
*/
public class Test {

public static void main(String[] args) {    ShareDate sd = new ShareDate();    Pro p = new Pro(sd);    Custor c = new Custor(sd);    Pro p1 = new Pro(sd);    Custor c1 = new Custor(sd);    p.start();    c.start();    p1.start();    c1.start();}

}

//生产者类
class Pro extends Thread{
private ShareDate sd;
public Pro(ShareDate sd){
this.sd = sd;
}
@Override
public void run() {
for (char c = ‘a’;c<=’d’;c++) {
try {
Thread.sleep((int)(Math.random()*3000));
} catch (InterruptedException e) {
e.printStackTrace();
}
sd.pushDate(c);
}
}
}

//消费者类
class Custor extends Thread{
private ShareDate sd;
public Custor(ShareDate sd){
this.sd = sd;
}
@Override
public void run() {
char c ;
do{
try {
Thread.sleep((int)(Math.random()*3000));
} catch (InterruptedException e) {
e.printStackTrace();
}

        c=sd.getData();    }while(c!='d');}

}

//资源类
class ShareDate{
private char c; //有字符
//生产者与消费者互相通知的一个标识
private boolean flag = false; //表示没有字符,消费者不能消费

//生产的方法public synchronized void pushDate(char c){    //表示可以生产    while(flag){        System.out.println("消费者还没有消费,因此生产者还不能生产");        try {            this.wait();//--->        } catch (InterruptedException e) {            e.printStackTrace();        }    }    this.c = c; //生产字符    flag = true; //表示通过消费者来消费    this.notify();    System.out.println("生产者已经生产完字符:"+c+"请消费者来消费");}//拿字符的方法public synchronized char getData(){    while(!flag){        System.out.println("生产者还没有生产,因此消费者还不能消费");        try {            this.wait();        } catch (InterruptedException e) {            e.printStackTrace();        }    }    this.notify();    flag = false;    System.out.println("消费者已经拿到字符:"+c+"请生产者来生产");    return c;}

}

0 0