概述
在之前的博客中介绍了wait()和notify()/notifAll(),它们只能选择随机唤醒或者全部唤醒等待锁的线程,如果遇到多个保护条件时容易导致过早唤醒问题,而Condition接口很好的解决了这个问题,它十分灵活,可以实现多路通知和选择性通知。文字有点抽象,看例子就明白了。
使用示例
场景:肯德基的货架中可以摆放各种食品,假设每个柜台只能卖一种食品,后厨可以生产各种食品放在货架上,当一种食品缺货时对应柜台则暂停出售,后厨补充了对应食品时会喊前台人员继续出售。
- 使用synchronized的写法:
public class Demo {
static final Object obj = new Object();
static int hamburger = 5;
static int chips = 0;
static class Cook extends Thread{
@Override
public void run() {
try {
while (true) {
if (hamburger == 0 ) {
synchronized (obj) {
hamburger++;
obj.notifyAll();
}
}
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
static class HamburgerCounter extends Thread{
@Override
public void run() {
try {
for (;;) {
while (hamburger > 0) {
System.out.println("HamburgerCounter卖出了第" + hamburger + "个汉堡");
hamburger--;
Thread.sleep(500);
}
synchronized (obj) {
System.out.