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类的状态切换 - 代码业务逻辑的校验,可以通过个别案例的实施流程来进行测试;
浙公网安备 33010602011771号