広告

Java : AbstractInterruptibleChannel - API使用例

AbstractInterruptibleChannel (Java SE 22 & JDK 22) の使い方まとめです。
ほとんどのメソッドにサンプルコードがあります。
APIドキュメントのおともにどうぞ。


概要

割込み可能チャネルのベース実装クラスです。

クラス構成

AbstractInterruptibleChannel クラスは、InterruptibleChannel を実装するのに必要な低レベルの機構を提供します。

このクラスをベースに、さまざまな割り込み可能チャネルが実装されています。
主なサブクラスとして FileChannel や SocketChannel, ServerSocketChannel などがあります。

try (final var executor = Executors.newSingleThreadExecutor()) {

    final var future = executor.submit(() -> {
        try (final var channel = ServerSocketChannel.open()) {

            System.out.println("AbstractInterruptibleChannel : "
                    + (channel instanceof AbstractInterruptibleChannel));

            System.out.println("bind ...");
            channel.bind(new InetSocketAddress("127.0.0.1", 8000));
            System.out.println("bind OK!");

            System.out.println("accept ...");
            channel.accept();
            System.out.println("accept OK!");

        } catch (ClosedByInterruptException e) {
            System.out.println("ClosedByInterruptException!");
        } catch (IOException e) {
            System.out.println("IOException!");
        }
    });

    TimeUnit.SECONDS.sleep(2);

    System.out.println("-- future.cancel --");
    future.cancel(true);
}

// 結果
// ↓
//AbstractInterruptibleChannel : true
//bind ...
//bind OK!
//accept ...
//-- future.cancel --
//ClosedByInterruptException!
try (final var executor = Executors.newSingleThreadExecutor()) {

    try (final var channel = ServerSocketChannel.open()) {
        executor.submit(() -> {
            try {
                System.out.println("bind ...");
                channel.bind(new InetSocketAddress("127.0.0.1", 8000));
                System.out.println("bind OK!");

                System.out.println("accept ...");
                channel.accept();
                System.out.println("accept OK!");

            } catch (AsynchronousCloseException e) {
                System.out.println("AsynchronousCloseException!");
            } catch (IOException e) {
                System.out.println("IOException!");
            }
        });

        TimeUnit.SECONDS.sleep(2);

        System.out.println("-- channel.close --");
    }
}

// 結果
// ↓
//bind ...
//bind OK!
//accept ...
//-- channel.close --
//AsynchronousCloseException!

コンストラクタ

AbstractInterruptibleChannel ()

このクラスの新しいインスタンスを初期化します。

protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。

メソッド

protected final void begin ()

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

protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。

final void close ()

現在のチャネルをクローズします。

final var path = Path.of("R:", "java-work", "test.data");
System.out.println(path); // R:\java-work\test.data

AbstractInterruptibleChannel channel;
try (final var fc = FileChannel.open(path,
        StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {

    channel = fc;
    System.out.println(channel.isOpen()); // true
}

System.out.println(channel.isOpen()); // false
// try-with-resources文を使わない例です。
final var path = Path.of("R:", "java-work", "test.data");
System.out.println(path); // R:\java-work\test.data

final AbstractInterruptibleChannel channel = FileChannel.open(path,
        StandardOpenOption.CREATE, StandardOpenOption.WRITE);
try {
    System.out.println(channel.isOpen()); // true
} finally {
    channel.close();
}

System.out.println(channel.isOpen()); // false

protected final void end (boolean completed)

無期限にブロックされる入出力操作の終了をマークします。

protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。

protected abstract void implCloseChannel ()

現在のチャネルをクローズします。

protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。

final boolean isOpen ()

現在のチャネルの状態がオープンであるかどうかを判断します。

final var path = Path.of("R:", "java-work", "test.data");
System.out.println(path); // R:\java-work\test.data

AbstractInterruptibleChannel channel;
try (final var fc = FileChannel.open(path,
        StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {

    channel = fc;
    System.out.println(channel.isOpen()); // true
}

System.out.println(channel.isOpen()); // false
// try-with-resources文を使わない例です。
final var path = Path.of("R:", "java-work", "test.data");
System.out.println(path); // R:\java-work\test.data

final AbstractInterruptibleChannel channel = FileChannel.open(path,
        StandardOpenOption.CREATE, StandardOpenOption.WRITE);
try {
    System.out.println(channel.isOpen()); // true
} finally {
    channel.close();
}

System.out.println(channel.isOpen()); // false

関連記事

ページの先頭へ