方法wait()的作用是使当前线程进行等待,wait()方法是Object类的方法,该方法用来将当前线程放到“预执行队列”,并在wait()所在的代码处停止执行,直到接到通知或中断为止。只能在同步方法或同步快中使用wait()方法,执行wait()后,当前线程释放锁。
方法notify()也要在同步方法或同步快中调用,在调用前也必须获得该对象的的对象级别锁。该方法用来通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规划器随机选出一个wait状态的线程,对其发出notify通知,使他等待获取对象锁。
在执行notify()后当前线程不会马上释放锁,会在线程退出synchronized代码块才会释放锁,呈wait状态的线程才可以获取锁。当第一个获取对象锁的wait线程运行结束释放锁后,如果该对象没有再次notify,其他wait状态的线程依然会阻塞wait状态,直到这个对象发出notify或notifyAll。
public class MyWait { private final Object lock;
MyWait(Object lock){ this.lock=lock;
} public void waitTest(){ try { synchronized (lock){
System.out.println("开始 wait time = " + System.currentTimeMillis());
lock.wait();
System.out.println("结束 wait time = " + System.currentTimeMillis());
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
public class MyNotify { private final Object lock;
MyNotify(Object lock){ this.lock=lock;
} public void notifyTest(){ synchronized (lock){
System.out.println("开始 notify time = " + System.currentTimeMillis());
lock.notify();
System.out.println("结束 notify time = " + System.currentTimeMillis());
}
}
}
public class Main { public static void main(String[] args){ try {
Object lock = new Object();
MyWait myWait = new MyWait(lock); new Thread(() -> myWait.waitTest()).start();
Thread.sleep(3000);
MyNotify myNotify = new MyNotify(lock); new Thread(() -> myNotify.notifyTest()).start();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
开始 wait time = 1552812964325
开始 notify time = 1552812967328
结束 notify time = 1552812967328
结束 wait time = 1552812967328
从输出内容可以看出3秒后执行notify方法,并在notify方法执行结束后才执行wait后的方法。
本节代码GitHub:https://github.com/lgsxiaosen/notes-code/tree/master/wait-notify