3个生产者线程,负责生产包子,每个线程每次只能生产1个包子放在桌子上
2个消费者线程负责吃包子,每人每次只能从桌子上拿1个包子吃。
首先创建桌子类,在里面运行制作包子及吃包子的线程代码
package day12.baozi;
import java.util.ArrayList;
import java.util.List;
/*
定义桌子类
定义一个存储包子的集合 存储包子
定义一个厨师生产包子的方法
定义一个吃货吃包子的方法
*/
public class Desk {
// 定义一个存储包子的集合 存储包子
private List<String> list = new ArrayList<>();
// 定义一个厨师生产包子的方法
public synchronized void put() {
try{
//获取厨师线程对象的名称
String name = Thread.currentThread().getName();
//判断有没有包子
if(list.size()==0){//没有包子 厨师要做包子
list.add(name+"做的包子..");//生产包子 把包子放到集合中
System.out.println("厨师:"+name+"正在做包子.....");
//模拟做包子的时间
Thread.sleep(2000);
//等待和唤醒方法 一般采用共享资源进行调用
//包子做完了
this.notifyAll();//唤醒所有的吃货
this.wait();//厨师进入休息 等待
}else {
//this.notifyAll();//唤醒所有的吃货
this.wait();//厨师进入休息 等待 因为桌子上有包子了。
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
//定义一个 吃货 吃包子的方法
public synchronized void get() {
try{
//获取吃货的名称
String name = Thread.currentThread().getName();
//先判断有没有包子
if(list.size()==1){
//模拟吃包子
System.out.println("吃货:"+name+"正在吃"+list.get(0));
list.clear();//清空
Thread.sleep(1500);
//吃饭之后
//唤醒厨师
this.notifyAll();
//吃货休息
this.wait();
}else {
//唤醒厨师
this.notifyAll();
//吃货休息
this.wait();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
创建运行类,在里面运行制作和吃的程序
package day12.baozi;
public class QingFengBaoZiPu {
public static void main(String[] args) {
//开始准备吃包子
System.out.println("进入包子铺 坐了下来 点餐");
//创建共享资源
Desk desk = new Desk();
//有三个厨师 线程
new Thread(()->{
//厨师要生产包子
while(true){
desk.put();
}
},"张大厨").start();
new Thread(()->{
//厨师要生产包子
while(true){
desk.put();
}
},"李大厨").start();
new Thread(()->{
//厨师要生产包子
while(true){
desk.put();
}
},"王大厨").start();
//有两个吃货 线程
new Thread(()->{
//吃货要次包子
while(true){
desk.get();
}
},"吃货A").start();
new Thread(()->{
//吃货要次包子
while(true){
desk.get();
}
},"吃货B").start();
}
}