package com.example.controller;
public class TestWaitAndNotify {
//锁对象
private static final Object lock = new Object();
public static void main(String[] args) throws Exception {
Thread thread1 = new Thread(() -> {
synchronized (lock) {
System.out.println("线程1...");
Task task1 = new Task();
task1.task(1);//任务1
//通知线程2线程1的任务完成
System.out.println("notify前");
//调用notify(),会唤醒一个WAITING状态的线程(注意:唤醒一个WAITING状态的线程并不是立马就执行那个被唤醒的线程,而是要等待当前线程执行完了后再执行那个被唤醒的线程),并给当前线程加锁,搭配wait方法使用
lock.notify();//如果这里不执行notify(), 那么线程2将得不到锁,也即是线程2后续的代码得不到执行权
//测试点1
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("notify后");
//测试点2
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock) {
System.out.println("线程2...");
Task task2 = new Task();
//等待线程1的任务1执行完毕
System.out.println("wait前");
try {
lock.wait();//调用wait()方法将会释放当前线程的锁,当前线程被挂起,等待其他线程调用notify()来唤醒当前线程
} catch (InterruptedException e) {
e.printStackTrace();
}
task2.task(2);//任务2
System.out.println("wait后");
}
});
thread2.start();
Thread.sleep(10);
thread1.start();
}
}
class Task {
public void task(int i) {
System.out.println("任务" + i + "完成!");
}
}
打印结果
线程2... wait前 线程1... 任务1完成! notify前 notify后