1.等待/通知机制
等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操作。上述两个线程通过对象O来完成交互,而对象上的wait()和notify/notifyAll()的关系就如同开关信号一样,用来完成等待方和通知方之间的交互工作。
等待/通知机制是线程池技术的基础,下面代码演示等待/通知机制:
/**
* 多线程里经典的 等待/通知机制演示
* 等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B
调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而
执行后续操作。上述两个线程通过对象O来完成交互,而对象上的wait()和notify/notifyAll()的
关系就如同开关信号一样,用来完成等待方和通知方之间的交互工作。
*/
public class WaitNotify {
static boolean flag = true;
static Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
// 先启动等待方(消费者),再启动通知方(生产者)
new Thread(new Wait(),"wait thread").start();
Thread.sleep(10000);
new Thread(new Notify(),"notify thread").start();
}
/**
* 等待方(消费者)遵循以下原则:
* 1.获取对象的锁
* 2.如果条件不满足,那么调用对象的wait()方法,等待条件变化并被通知,被通知后仍要检查条件
* 3.条件满足则执行对应的逻辑
* 伪代码如下:
synchronized (对象) {
while (条件不满足) {
对象.wait();
}
对应的处理逻辑
}
*/
static class Wait implements Runnable {
@Override
public void run() {
synchronized (lock) {
while (flag) {
try {
System.out.println(Thread.currentThread().getName() + " waiting");
lock.wait(); // wait方法会让当前线程进入waiting状态,并释放锁,线程会在这里停下,等待其他线程唤醒
System.out.println(Thread.currentThread().getName() +