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