Java_多线程等待唤醒机制案例
以消费者吃包子、生产者卖包子为例,显现生产者和消费者之间的多线程通信
public class SellBaozi {
//main方法
public static void main(String[] args) {
Baozi baozi = new Baozi();
Buyer buyer = new Buyer(baozi);
Seller seller = new Seller(baozi);
new Thread(buyer).start();//买
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(seller).start();
}
}
//包子类
class Baozi {
boolean statue = true;
void Baozi() {
}
public boolean isStatue() {
return statue;
}
public void setStatue(boolean statue) {
this.statue = statue;
}
}
//消费者
class Buyer implements Runnable {
Baozi b;
public Buyer(Baozi b) {
this.b = b;
}
@Override
public void run() {
buyBaozi(b);
}
void buyBaozi(Baozi b) {
while (true) {
synchronized ("a") {
if (b.statue) {//有包子
System.out.println("吃包子,好香啊");
b.setStatue(false);//无包子
"a".notify();
} else {
System.out.println("等包子");
try {
"a".wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
//生产者
class Seller implements Runnable {
Baozi b;
public Seller(Baozi b) {
this.b = b;
}
@Override
public void run() {
makeBaozi(b);
}
private void makeBaozi(Baozi b) {
while (true) {
synchronized ("a") {
if( !(b.statue)) {//无包子
System.out.println("做包子。。。猪肉馅的");
b.setStatue(true);
"a".notify();
} else {//无包子
System.out.println("卖包子");
try {
"a".wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
代码执行结果
吃包子,好香啊
等包子
做包子。。。猪肉馅的
卖包子
吃包子,好香啊
等包子
做包子。。。猪肉馅的
卖包子
小结:
- 锁唤醒机制中必须使用的是同一个锁
"a"
(Synchronized
) - 代码逻辑实现中注意
Baozi
类的状态切换 - 代码业务逻辑的校验,可以通过个别案例的实施流程来进行测试;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了