有很多detailed advice about handling InterruptedException
。是否有任何相同的原理适用于处理来自NIO调用的ClosedChannelException
(可以是ClosedByInterruptException
)?特别是在捕获CBIE时,应该调用Thread.currentThread().interrupt()
吗?
在Java中处理ClosedChannelException
applesseed 回答:在Java中处理ClosedChannelException
这是ClosedByInterruptException
的文档所说的(强调我的):
一个线程在通道的I / O操作中被阻塞时,另一个线程中断该线程时接收到的已检查异常。 在引发此异常之前,通道将被关闭,并且先前被阻塞的线程的中断状态将被设置。
此外,ClosedByInterruptException
类及其超类AsynchronousCloseException
与实现InterruptibleChannel
的通道相关联。该界面的文档说(强调我的):
可以异步关闭和中断的通道。
实现此接口的通道是异步关闭的:如果某个线程在可中断通道的I / O操作中被阻塞,则另一个线程可以调用该通道的
close
方法。这将导致被阻止的线程收到AsynchronousCloseException
。实现此接口的通道也是可中断的:如果某个线程在可中断通道的I / O操作中被阻塞,则另一个线程可以调用被阻塞的线程的{{1} } 方法。这将导致通道关闭,阻塞线程接收到
interrupt
并设置阻塞线程的中断状态。如果已经设置了线程的中断状态,并且在通道上调用了阻塞I / O操作,则该通道将被关闭,线程将立即收到
ClosedByInterruptException
;其中断状态将保持不变。仅当实现此接口时,该通道才支持异步关闭和中断。可以在运行时通过
ClosedByInterruptException
运算符对此进行测试。
换句话说,在捕获instanceof
之后,您不需要调用Thread.currentThread().interrupt()
,因为该通道已经设置或只是维护了线程的中断状态。我怀疑指定这种行为是为了避免强迫开发人员不得不重新中断线程,这与捕获ClosedByInterruptException
不同。