コメントで言及したタイマースレッドがあり、一定の時間が経過するとチャネルが中断されると仮定すると、処理する必要のある2つのケースがあり、それぞれに独自のチェック済み例外があります。
- ケース1:
close()
I / O操作でスレッドがブロックされているときに、チャネルで呼び出された別のスレッド。への呼び出しは。write
で中止されますAsynchronousCloseException
。
- ケース2:
interrupt()
I / O操作でブロックしているときに、別のスレッドがスレッドで呼び出されました。への呼び出しは。write()
で中止されClosedByInterruptException
ます。
これらの例外を処理するようにコードを更新する必要があります。
this.outstream = Channels.newChannel(outstream);
try {
outstream.write(message);
}
catch(AsynchronousCloseException e) {
System.out.println("Another thread closed the stream while this one was blocking on I/O!");
}
catch(ClosedByInterruptException e) {
System.out.println("This thread has been interrupted while blocking on I/O!");
}
のコントラクトでは、現在のスレッドがI/O操作でブロックされている場合InterruptibleChannel
にのみこれらの例外がスローされるように指定されていることに注意してください。スレッドがブロックされていない場合、これらの例外はいずれもスローされません。その場合、別のスレッドがチャネルを閉じた場合、閉じたチャネルに書き込もうとすると別のIOExceptionが発生する可能性があり、現在のスレッドの中断ステータスに注意を払っていない場合は、書き込みを続行します。ただし、その場合の動作はインターフェイスで指定されていないため、何をするかは実装者が決定します。