Module java.base

Class AbstractInterruptibleChannel

java.lang.Object
java.nio.channels.spi.AbstractInterruptibleChannel
所有已实现的接口:
Closeable, AutoCloseable, Channel, InterruptibleChannel
直接已知的子类:
FileChannel, SelectableChannel

public abstract class AbstractInterruptibleChannel extends Object implements Channel, InterruptibleChannel
可中断通道的基本实现类。

该类封装了实现通道异步关闭和中断所需的底层机制。具体的通道类在调用可能会无限期阻塞的I/O操作之前和之后必须分别调用beginend方法。为确保始终调用end方法,这些方法应该在try ... finally块中使用:

    boolean completed = false;
    try {
        begin();
        completed = ...;    // 执行阻塞的I/O操作
        return ...;         // 返回结果
    } finally {
        end(completed);
    }

end方法的completed参数指示I/O操作是否实际完成,即操作是否具有对调用者可见的任何效果。例如,对于读取字节的操作,如果实际传输了一些字节到调用者的目标缓冲区,则此参数应为true

具体的通道类还必须以这样的方式实现implCloseChannel方法,即如果在另一个线程在通道上的本机I/O操作中被阻塞时调用它,则该操作将立即返回,通过抛出异常或正常返回。如果线程被中断或其所阻塞的通道被异步关闭,则通道的end方法将抛出适当的异常。

该类执行实现Channel规范所需的同步。实现implCloseChannel方法无需与可能试图关闭通道的其他线程同步。

自 JDK 版本:
1.4
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
    初始化此类的新实例。
  • Method Summary

    Modifier and Type
    Method
    Description
    protected final void
    begin()
    标记可能会无限期阻塞的 I/O 操作的开始。
    final void
    close()
    关闭此通道。
    protected final void
    end(boolean completed)
    标记可能会无限期阻塞的 I/O 操作的结束。
    protected abstract void
    关闭此通道。
    final boolean
    isOpen()
    告知此通道是否打开。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • AbstractInterruptibleChannel

      protected AbstractInterruptibleChannel()
      初始化此类的新实例。
  • Method Details

    • close

      public final void close() throws IOException
      关闭此通道。

      如果通道已关闭,则此方法立即返回。否则,它将标记通道已关闭,然后调用implCloseChannel方法以完成关闭操作。

      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Channel
      指定者:
      close 在接口 Closeable
      指定者:
      close 在接口 InterruptibleChannel
      抛出:
      IOException - 如果发生 I/O 错误
    • implCloseChannel

      protected abstract void implCloseChannel() throws IOException
      关闭此通道。

      此方法由close方法调用,以执行关闭通道的实际工作。仅当通道尚未关闭时才会调用此方法,而且永远不会多次调用。

      此方法的实现必须安排任何其他线程,如果该线程在此通道上的 I/O 操作中被阻塞,则立即返回,通过抛出异常或正常返回。

      抛出:
      IOException - 如果在关闭通道时发生 I/O 错误
    • isOpen

      public final boolean isOpen()
      从接口复制的描述: Channel
      告知此通道是否打开。
      指定者:
      isOpen 在接口 Channel
      返回:
      true 如果且仅如果此通道打开
    • begin

      protected final void begin()
      标记可能会无限期阻塞的 I/O 操作的开始。

      应该与end方法一起使用,使用如上所示的try ... finally块,以实现此通道的异步关闭和中断。

    • end

      protected final void end(boolean completed) throws AsynchronousCloseException
      标记可能会无限期阻塞的 I/O 操作的结束。

      应该与begin方法一起使用,使用如上所示的try ... finally块,以实现此通道的异步关闭和中断。

      参数:
      completed - 如果且仅如果 I/O 操作成功完成,即对操作的调用者可见的某些效果
      抛出:
      AsynchronousCloseException - 如果通道被异步关闭
      ClosedByInterruptException - 如果阻塞在 I/O 操作中的线程被中断