モジュール java.base
パッケージ java.nio.channels.spi

クラスAbstractInterruptibleChannel

  • すべての実装されたインタフェース:
    Closeable, AutoCloseable, Channel, InterruptibleChannel
    直系の既知のサブクラス:
    FileChannel, SelectableChannel

    public abstract class AbstractInterruptibleChannel
    extends Object
    implements Channel, InterruptibleChannel
    割込み可能チャネルのベース実装クラスです。

    このクラスは、チャネルの非同期クローズと非同期割込みを実装するのに必要な低レベルの機構をカプセル化しています。 具象チャネル・クラスは、無期限にブロックされる可能性のある入出力操作の呼出し前にbeginメソッドを、呼出し後にendメソッドをそれぞれ呼び出す必要があります。 endメソッドが必ず呼び出されるように、try ... finallyブロック内でこれらのメソッドを使用するようにしてください。

     boolean completed = false;
     try {
         begin();
         completed = ...;    // Perform blocking I/O operation
         return ...;         // Return result
     } finally {
         end(completed);
     }

    endメソッドのcompleted引数は、入出力操作が実際に完了したかどうか、つまり、呼出し元で何かの変化を認識できるかどうかを示します。 たとえば、バイトを読み取る操作では、呼出し元のターゲット・バッファに実際にバイトが転送された場合に限り、この引数がtrueになります。

    具象チャネル・クラスは、implCloseChannelメソッドも実装する必要があります。その場合、チャネルに対するネイティブの入出力操作の途中でブロックされているスレッドがあるときにこのメソッドが呼び出されると、例外をスローするか通常の方法でただちに終了するように実装します。 スレッドに割込みが発生した場合や、スレッドをブロックしているチャネルが非同期でクローズされた場合、チャネルのendメソッドは該当する例外をスローします。

    このクラスは、Channelの仕様を実装するのに必要な同期処理を行います。 implCloseChannelメソッドの実装では、チャネルをクローズしようとするほかのスレッドに対して同期処理を行う必要はありません。

    導入されたバージョン:
    1.4
    • コンストラクタの詳細

      • AbstractInterruptibleChannel

        protected AbstractInterruptibleChannel()
        このクラスの新しいインスタンスを初期化します。
    • メソッドの詳細

      • close

        public final void close()
                         throws IOException
        現在のチャネルをクローズします。

        チャネルがすでにクローズしている場合、このメソッドはただちに終了します。 それ以外の場合は、チャネルのクローズをマークしてから、クローズ操作を完了するためにimplCloseChannelメソッドを呼び出します。

        定義:
        close、インタフェースAutoCloseable
        定義:
        close、インタフェースChannel
        定義:
        close、インタフェースCloseable
        定義:
        close、インタフェースInterruptibleChannel
        例外:
        IOException - 入出力エラーが発生した場合
      • implCloseChannel

        protected abstract void implCloseChannel()
                                          throws IOException
        現在のチャネルをクローズします。

        このメソッドは、チャネルをクローズする実際の処理を実行するためにcloseメソッドによって呼び出されます。 このメソッドは、チャネルがまだクローズしていない場合にのみ呼び出され、2回以上呼び出されることはありません。

        このメソッドの実装は、このチャネルに対する入出力操作の途中でブロックされるその他のスレッドを、例外をスローするか、通常の方法を使ってただちに終了させることになっています。

        例外:
        IOException - チャネルのクローズ中に入出力エラーが発生した場合
      • begin

        protected final void begin()
        無期限にブロックされる入出力操作の開始をマークします。

        このチャネルの非同期クローズと非同期割込みを実装するには、に示したとおり、try ... finallyブロックを使ってこのメソッドとendメソッドをペアで呼び出す必要があります。

      • end

        protected final void end​(boolean completed)
                          throws AsynchronousCloseException
        無期限にブロックされる入出力操作の終了をマークします。

        このチャネルの非同期クローズと非同期割込みを実装するには、に示したとおり、try ... finallyブロックを使ってこのメソッドとbeginメソッドをペアで呼び出す必要があります。

        パラメータ:
        completed - 入出力操作が正しく完了した場合、つまり、操作の呼出し側に何らかの変化が見られた場合にかぎりtrue
        例外:
        AsynchronousCloseException - チャネルが非同期クローズされた場合
        ClosedByInterruptException - 入出力操作中にブロックされたスレッドに割込みが発生した場合