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