单线程模式
注:生产者消费者模式之所有能够保持两个线程之间的通信 是因为有一个共享的内存(该案例中共享内存Desk类)
生产者类
public class pruducer implements Runnable {
private Desk desk;
public pruducer(Desk desk) {
this.desk = desk;
}
@Override
public void run() {
while (true) {
synchronized (desk) {
if (desk.getFlag()) { //判断食物的状态 如果为真 说明有食物 厨子等下一在做
try {
desk.wait(); //等待
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
desk.addFood();//说明没有食物 厨子该做食物了
desk.setFlag(true);//改变食物的状态 说明该做厨子了
desk.notify();//唤醒吃货 能吃了
}
}
}
}
}
消费者类
public class Consumer implements Runnable {
private Desk desk;
public Consumer(Desk desk) {
this.desk = desk;
}
@Override
public void run() {
while (true) {
synchronized (desk) {
if (!desk.getFlag()) { //判断食物的状态 有没有做好 吃货先等一下
try {
desk.wait();//等待
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
desk.eatFood();//说明有食物 可以吃了
desk.setFlag(false);//吃完改下食物的状态
desk.notify();//唤醒厨子 吃完了 能继续做了
}
}
}
}
}
共有的类
public class Desk {
private Integer count=0; //生成食物的数量
private Boolean flag=false; //状态
public Desk() {
}
public Desk(Integer count, Boolean flag) {
this.count = count;
this.flag = flag;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
public void addFood(){
count++;
System.out.println(Thread.currentThread().getName() + "做了第" + count + "个包子.");
}
//提供一个公共的方法供消费者访问,当访问了这个方法就代表吃了一个食物.
public void eatFood() {
System.out.println(Thread.currentThread().getName() + "吃了第" + count + "个包子.");
}
}
测试类
public class Test {
public static void main(String[] args) {
Desk desk =new Desk();
pruducer pruducer =new pruducer(desk);
Consumer consumer =new Consumer(desk);
Thread t1 =new Thread(pruducer,"厨子");
Thread t2 =new Thread(consumer,"吃货");
t1.start();
t2.start();
}
}