当线程在某个监视器上调用notify时,它将唤醒在该监视器上等待的单个线程,但是 哪个
线程被唤醒由调度程序决定。(或者,一个线程可以调用notifyAll,唤醒所有等待该监视器的线程,然后它们都争夺该监视器,然后失败者回到等待状态。)这就是为什么调用的目标不同,所以发出通知的原因监视器,它告诉调度程序选择一个线程来唤醒。
与通知不同,中断针对特定线程。并且中断不需要被中断的线程在监视器上等待。要使线程在监视器上调用wait,它必须先获取该监视器,然后再等待以释放该监视器,直到线程完成等待或中断为止。
Oracle的建议是仅将中断用于取消。同样,java.util.concurrent中的类也设计为使用中断进行取消。
在您的示例中,中断将不会非常有效,因为控制不会离开while循环,线程仍然必须检查其等待的条件,并且在while循环条件中没有检查是否设置了中断标志。被中断的线程很可能会回到等待状态。
为了使此代码在被中断后立即退出,而不是返回等待状态,请在循环条件中添加对中断标志状态的检查,并让catch块设置中断标志(在引发异常时将其重置):
synchronized (Foo.class) { while (someCondition && !Thread.currentThread().isInterrupted()) { try { Foo.class.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }}


