Java 1.4+ では、ソケット I/O でブロックされているストリームを中断する方法が 3 つあります。
- ソケットが通常の
java.net.Socket(InetAddress, int)
コンストラクターを使用して作成された場合、別のスレッドから閉じることができます。その結果、SocketException
ブロックされたスレッドで a がスローされます。 - を使用してソケットが作成された場合
SocketChannel.open(...)
。socket()
(ノンブロッキング I/O) — 繰り返しますが、別のスレッドから閉じることは可能ですがAsynchronousCloseException
、ブロックされたスレッドで別の例外 ( ) がスローされます。 - さらに、ノンブロッキング I/O が使用されている場合は、ブロックされたスレッドを
ClosedByInterruptException
スローして中断することができます。古いスタイルの Java I/O を使用しているときにブロックされたスレッドを中断しても、スレッドには影響しません。
質問:
- 古いスタイルの I/O を使用している場合、スレッドセーフな別のスレッドからソケットを閉じていますか? そうでない場合、代替手段は何ですか?
- 代わりに NIO を使用する場合、スレッドセーフな別のスレッドからソケット/チャネルを閉じていますか?
Socket.close()
通常の IO とは対照的に NIO を使用する場合、動作に違いはありますか?- スレッドを中断するだけでブロックされた I/O 操作を終了する可能性以外に、ネットワークに NIO を使用する利点はありますか(ソケットへの参照を保持する必要がなくなります)。