个人理解,首先两个方法签名都有throws InterruptedException,所以你说到的答案中wait()不需要捕获异常这一点我不是很能理解。 其次,InterruptedException在<<Java并发编程实战>>这本书中,作者指出这个异常事实上类似于传统意义上的中断概念。调用者需要一个方式来得知当前的线程已被“中断”。这里InterruptedException就起到了这么一个通知的作用,例如: try {
Thread.sleep(100);
} catch (InterruptedException ex) {
// Stop immediately and go home
}
这里的异常就可以向外流转,让调用者来作出当线程发生“中断”这一事件后的响应。如果sleep只是单纯的sleep,不对在sleep过程当中触发的“中断”作出任何响应(例如这里的抛出异常)的话,那么就等同于你忽略了这个时段内线程中的“中断请求”,这样是不符合java线程设计的(这个可以参考下Thread#interrupt()方法的文档)。总而言之,java的线程设计的期望是要么能快速执行完毕自动结束,要么就是执行时间较长但是能够随时响应“中断” If your code is fast, you never check the interruption flag, because you don't want to deal with any interruptions.
If your code is slow and may take seconds to execute, make it explicit and handle interruptions somehow.
Ref: http://www.yegor256.com/2015/10/20/interrupted-exception.html 我不是专业写java后台的,如果有更专业的见解欢迎来讨论。这个问题我个人认为是一个非常好的问题👍