在Java中处理ClosedChannelException

有很多detailed advice about handling InterruptedException。是否有任何相同的原理适用于处理来自NIO调用的ClosedChannelException(可以是ClosedByInterruptException)?特别是在捕获CBIE时,应该调用Thread.currentThread().interrupt()吗?

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不同。

本文链接:https://www.f2er.com/3165241.html

大家都在问