线程wait()等待后,可以调用notify()唤醒线程,如果notify()唤醒的过早,在wait()等待之前就调用了notify()可能会打乱程序正常的运行逻辑。
所以若notify()通知过早,就不让线程等待了
public class WaitTest {
static boolean isFirst = true; //定义静态变量作为是否第一个运行的线程标志
public static void main(String[] args) {
final Object lock = new Object(); //定义锁对象
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock){
while (isFirst) {
try {
System.out.println("wait begin");
lock.wait();
System.out.println("wait end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
System.out.println("notify begin");
lock.notify();
System.out.println("notify end");
isFirst = false;
}
}
});
// t2.start();
// t1.start(); //notify begin notify end
t1.start();
t2.start();
/*
wait begin
notify begin
notify end
wait end
*/
}
}
实际上,调用start()就是告诉线程调度器,当前线程准备就绪,线程调度器在什么时候开启这个线程不确定,即调用start()方法的顺序,并不一定就是线程实际开启的顺序.
原文:https://www.cnblogs.com/silloutte/p/14832277.html