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