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;
}
}