经典范式:
等待方遵循如下原则:
1、获取对象的锁。
2、如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件。
3、条件满足则执行对应的逻辑任务。
伪代码如下:synchronized(对象) {
while(条件不满足) {
对象.wait();
}
完成任务逻辑
}
通知方遵循如下原则:
1、获得对象的锁。
2、改变条件。
3、通知所有等待在对象上的线程。
伪代码如下:synchronized(对象) {
改变对象
对象.notifyAll();
}
示例代码:import java.text.SimpleDateFormat;import java.util.Date;/**
* 线程等待/通知机制
* Created by peng on 2018/7/22.
*/public class WaitNotify {
private static boolean flag = true; private static Object lock = new Object(); public static void main(String[] args) {
Thread waitThread = new Thread(new Wait(), "WaitThread");
waitThread.start();
SleepUtils.second(1);
Thread notifyThread = new Thread(new Notify(), "NotifyThread");
notifyThread.start();
} private static class Wait implements Runnable {
@Override
public void run() { // 加锁,拥有lock的Monitor
synchronized (lock) { // 当条件不满足时,继续wait,同时释放了lock的锁
while (flag) {
try {
System.out.println(Thread.currentThread() + " flag is true. wait @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} // 条件满足时,完成工作
System.out.println(Thread.currentThread() + " flag is false. running @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
}
}
private static class Notify implements Runnable {
@Override
public void run() { // 加锁,拥有lock的Monitor
synchronized (lock) {
System.out.println(Thread.currentThread() + " hold lock. notify @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
lock.notifyAll();
flag = false;
SleepUtils.second(5);
} // 再次加锁
synchronized (lock) {
System.out.println(Thread.currentThread() + " hold lock again. sleep @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
SleepUtils.second(5);
}
}
}
}