线程中断机制是让(协作)线程响应请求以停止其正在执行的操作的首选方法。任何线程(我认为包括线程本身)都可以调用interrupt()
在一个线程上。
在实践中,正常用例interrupt()
涉及某种框架或管理器告诉某些工作线程停止他们正在做的事情。如果工作线程是“中断感知”的,它将注意到它已通过异常或通过定期检查其中断标志而被中断。当注意到它被中断时,一个表现良好的线程会放弃它正在做的事情并自行结束。
假设上述用例,如果您的代码在 Java 框架内或从某个工作线程运行,则它可能会被中断。当它被中断时,您的代码应该放弃它正在做的事情并以最合适的方式使其自身结束。根据代码的调用方式,这可以通过返回或抛出一些适当的异常来完成。但它可能不应该调用System.exit()
。 (你的应用程序不一定知道它为什么被中断,它当然也不知道是否还有其他线程需要被框架中断。)
另一方面,如果您的代码并非设计为在某些框架的控制下运行,您可能会认为InterruptedException
是意外的异常;即一个错误。在这种情况下,您应该像对待其他错误一样对待异常;例如将其包装在未经检查的异常中,并在处理其他意外的未经检查的异常时捕获并记录它。 (或者,您的应用程序可以简单地忽略中断并继续执行其正在执行的操作。)
1)如果我自己从不中断其他线程,什么会触发InterruptedException?
一个例子是,如果您的Runnable
对象是使用ExecutorService
and shutdownNow()
被服务调用。理论上,任何第三方线程池或线程管理框架都可以合法地执行类似的操作。
2)如果我从来没有使用interrupt()来中断其他线程......InterruptedException
那么是什么意思?抓到一只后我该怎么办?关闭我的应用程序?
您需要分析代码库以找出是什么造成了interrupt()
电话以及原因。一旦你弄清楚了这一点,你就可以弄清楚应用程序的 >>your
直到你知道为什么InterruptedException
被抛出,我建议将其视为硬错误;例如将堆栈跟踪打印到日志文件并关闭应用程序。 (显然,这并不总是正确的答案......但重点是这是“一个错误”,需要引起开发人员/维护人员的注意。)
3) 我如何知道谁/什么来电interrupt()
?
对此没有好的答案。我能建议的最好的办法是设置一个断点Thread.interrupt()
并查看调用堆栈。