等待
等待操作在调用wait()或时间形式wait(long millisecs)和wait(long millisecs,int nanosecs)之后发生。具有参数0的wait(long millisecs)调用或具有两个0参数wait(long millisecs,int nanosecs)的调用等同于wait()的调用。
如果线程没有在抛出中断异常InterruptedException的情况返回,那么线程从wait()正常返回。
通知
通知操作在调用notify()或notifyAll()调用后发生。令线程t是执行对象m上的方法的任一线程,并令n是线程t在对象m上加锁操作的数量,同时n没有被解锁操作匹配,会有以下情形发生:
- if n == 0 ,则抛出IllegalMonitorStateException。情景是:线程t已没有占有目标对象m的锁;
- if n > 0 ,并且这是一个notify()操作,那么如果对象m的等待集合不是空的,则是对象m当前等待集合中的一个成员线程u被选择,并从等待集合中删除,让线程u在等待操作中得以继续。注意,直到t完全解锁对象m监视器之后,u的加锁操作才能成功;
- if n > 0 ,并且这是一个notifyAll()操作,那么所有等待线程人等待集合中删除。
中断
中断操作在调用方法Thread.interrupt()或new ThreadGroup().interrupt()之后发生。
等待、通知、中断的交互