等待队列
所有实例都拥有一个等待队列,它是在实例的wait方法执行后停止操作的线程的队列。当下列任意一种情况发生时,线程便会退出等待队列。
- 有其他线程的notify方法来唤醒线程
- 有其他线程的notifyAll方法来唤醒线程
- 有其他线程的interrupt方法来唤醒线程
- wait方法超时
wait方法——将线程放入等待队列
获取了锁的线程A执行wait方法。
线程A进入等待队列,释放锁。
线程B能够获取锁。
notify方法——从等待队列中取出线程
获取了锁的线程B执行notify方法。
线程A退出等待队列,想要进入wait的下一个操作,但刚才执行notify的线程B仍持有着锁。
刚才执行notify的线程B释放了锁。
退出等待队列的线程A获取锁,执行wait的下一个操作。
notifyAll方法——从等待队列中取出所有线程
notifyAll方法唤醒所有线程,并让所有线程都退出等待队列。
由于notify唤醒的线程较少,所以处理速度要比使用notifyAll时快。
但使用notify时,如果处理不好,程序便可能会停止。一般来说,使用notifyAll时的代码要比使用notify时的更为健壮。