NIO的Channel可中断的能力
Channel可相应中断进入关闭状态。
关键在于使用AbstractInterruptibleChannel的begin()和end(completed)方法。
1、在begin()方法中 创建了Interruptible接口的对象 interruptor中断器,并使用blockOn(interruptor)方法,将interruptor绑定到当前线程的blocker属性。
2、当使用thread.interrupt()方法时首先会设置线程的中断标志位。然后调用blocker的interrupt(target)方法,改变Channel的open属性为false,然后将target赋值给Channel的interrupted属性。最后调用implCloseChannel()方法,先关闭Channel,再将Channel注册的所有SelectionKey取消注册。
3、enq(completed)方法进行最后的处理有可能会抛出ClosedChannelException(对已经关闭的Channel进行I/O操作)和 AsynchronousCloseException(对I/O操作没有结束的Channel进行中断取消)
解读
AbstractInterruptibleChannel类:可中断Channel的基本实现类
public abstract class AbstractInterruptibleChannel
implements Channel, InterruptibleChannel{
1、AbstractInterruptibleChannel实现了Channel和InterruptibleChannel接口
1)、public interface Channel extends Closeable {
public boolean isOpen();
:判断Channel是否打开public void close() throws IOException;
:关闭Channel(已经关闭无影响)。如果对已经关闭的channel进行I/O请求,会抛出ClosedChannelException异常。
2)、public interface InterruptibleChannel extends Channel{
public void close() throws IOException;
:如果在没有完成I/O操作的时候对channel进行关闭会抛出 AsynchronousCloseException异常。
2、使用的方法简介
boolean completed = false;
try {
begin();
completed = ...; // Perform blocking I/O operation