🕐 等待唤醒机制
生产者
```java
public class Cook extends Thread {
@Override
public void run() {
while (true){
synchronized (Desk.lock){
if (Desk.count == 0){
break;
}else {
//判断桌子上有没有面条
if (Desk.DataFlag == 1){
//有就等待
try {
Desk.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//没有就做面条
System.out.println("厨师做了一碗面条");
//修改状态
Desk.DataFlag = 1;
//唤醒消费者
Desk.lock.notifyAll();
}
}
}
}
}
}
```
桌子
```java
/*
* 控制生产者或消费者的执行
* */
public class Desk {
//是否有数据 0没有 1没有
public static int DataFlag = 0;
//总共数
public static int count = 10;
//锁对象
public static Object lock = new Object();
}
```
消费者
```java
public class Foodle extends Thread {
@Override
public void run() {
while (true){
synchronized (Desk.lock){
//判断共享数据是否到了末尾
if (Desk.count == 0){
break;
}else {
//判断桌子上是否有面条
if (Desk.DataFlag == 0){
//如果没有就等待
try {
Desk.lock.wait(); //让当前线程和锁进行绑定
} catch (InterruptedException e) {
e.printStackTrace();
}
Desk.lock.notifyAll();//唤醒这把锁绑定的所有线程
}else {
Desk.count--;
//如果有就开吃
System.out.println("吃货正在吃面条,还能再吃"+Desk.count+"碗");
//吃完之后唤醒厨师继续做
Desk.lock.notifyAll();
//修改桌子状态
Desk.DataFlag = 0;
}
}
}
}
}
}
```