Condition
主要用 await 和 signal,跟 Object 的 wait、notify 差不多用法,只是这里是用 lock 来替换 synchronized。
这边复制一下之前的 wait 和 notif 例子修改一下
示例
public class ConditionDemo {Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
private String tv = "广告";
static class Tv extends Thread {
ConditionDemo waitDemo;
public Tv(ConditionDemo waitDemo) {this.waitDemo = waitDemo;}
@Override
public void run() {waitDemo.waitTv();
}
}
public void waitTv() {lock.lock();
try {while (tv.equals("广告")) {
try {condition.await();
if (tv.equals("广告")) {System.out.println(Thread.currentThread().getName() + "-" + "骗人,还是广告");
}
} catch (InterruptedException e) {e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "-" + "愉快的追剧");
}finally {lock.unlock();
}
}
public void sendTrueMsg() {lock.lock();
try {
tv = "正剧";
condition.signalAll();}finally {lock.unlock();
}
}
public void sendFalseMsg() {lock.lock();
try {condition.signalAll();
}finally {lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {ConditionDemo waitDemo = new ConditionDemo();
Tv tv1 = new Tv(waitDemo);
Tv tv2 = new Tv(waitDemo);
tv1.start();
tv2.start();
Thread.sleep(100);
waitDemo.sendFalseMsg();
Thread.sleep(100);
waitDemo.sendTrueMsg();}
}
运行结果如下: