基本上,您不是在寻找教科书的差异,而是在寻找它们的用例差异。
正如人们已经指出的那样,唤醒线程并不是唯一的结果,但是t1.interrupt()
从 Thread调用t2
fort1
会导致in 线程 t1 ,这是andInterruptedException
之间的一个很大区别。Object.notify()
Thread.interrupt()
您应该了解它的方法Object.wait()
会抛出检查InterruptedException
并强制您处理它。对象.等待。
InterruptedException - 如果任何线程在当前线程等待通知之前或期间中断了当前线程。抛出此异常时清除当前线程的中断状态。
然后你应该参考这个问题来了解如何处理这个异常。
两者之间的区别在于,一个用于通常的逻辑编程内容(等待和通知)的线程间通信,另一个(中断)用于抢占式线程取消/终止,即使在阻塞操作的情况下也是如此。您必须注意,Java 没有提供任何抢先取消线程的机制,因此您必须为此目的使用中断机制(显然,如果您的情况需要这样做。如果不适用于您的案子)。
Java 不会限制您之后的操作InterruptedException
,您可以做任何您想做的事情,但不建议将其用于执行线程取消策略以外的其他事情。当程序员编写多线程程序时,线程取消策略通常被忽略且讨论较少的领域,这就是为什么您可能会发现难以理解用例的原因。
像BlockingQueue.put(..)这样的 API 方法试图通过抛出来告诉你的InterruptedException
是,即使它的阻塞操作也可以被抢先终止。并非所有阻塞 API 方法都将为您提供该功能。
线程的取消/终止使用Thread.interrupt()
不是一种强有力但合作的机制,它只是一个请求而不是命令。
强烈建议不要使用 ,e.printStackTrace();
因为如果打算将其记录为错误,这通常不是错误。
希望能帮助到你 !!