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