实现wait/notify机制的条件
拥有相同锁的线程才可以实现 wait/notify机制,所以后面的描述中都是假定操作同一个锁。
wait()方法及作用
wait() 方法是 Object类的方法,它的作用是使当前执行 wait() 方法的线程等待,在 wait() 所在的
代码行处暂停执行,并释放锁,直到接到通知或被中断为止。在调用wait()之前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用 wait()方法。通过通知机制使某个线程继续执行 wait()方法后面的代码时,对线程的选择是按照执行 wait()方法的顺序确定的,并需要重新获得锁。如果调用 wait()时没有持有适当的锁,则抛出 IllegalMonitorStateException,它是RuntimeException 的一个子类,因此不需要 try-
catch 语句捕捉异常。
notify()方法及作用
notify()方法要在同步方法或同步块中调用,即在调用前,线程必须获得锁,如果调用 notify()
时没有持有适当的锁,则会抛出IllegalMonitorStateException 。该方法用来通知那
些可能等待该锁的其他线程,如果有多个线程等待,则按照执行 wait() 方法的顺序对处于 wait 状态的线程发出一次通知(notify),并使该线程重新 获取锁。需要说明的是,执行 notify()方法后,当前线程不会马上释放该锁,呈 wait状态的线程也并不能马上获取该对象锁,要等到执行 notify()方法的线程将程序执行完,也就是退出synchronized同步区域后,当前线程才会释放锁,而呈wait状态的线程才可以获取该对象锁。当第一个获得了该对象锁的 wait线程运行完毕后,它会释放该对象锁,此时如果没有再次使用 notify语句,那么其他呈 wait状态的线程因为没有得到通知,会继续处于 wait 状态。
总结
wait() 方法使线程暂停运行,而notify()方法通知暂停的线程继续运行。