Java.nio以外のJavaには、非同期io(ソケットベース)のオプションはありますか?また、Java.nioはバックグラウンドでスレッドを使用しますか(.NETのasync-socket-libraryと同様に、おそらく変更されていると思います)、または適切なselect呼び出しを使用して「true」の非同期ioですか?
JavaのNIOパッケージ(Java6以降)は、 Selector sを介して、ノンブロッキングI/Oのみをサポートします。 Java7は、非同期I/Oサポートを含むNIO.2とともに出荷される予定です。今日、あなたの最善の策はフレームワークを利用することです。 ARMisticeはMinaに言及しました。他にもいくつかあります。
さて、スレッドに関するあなたの質問に関して、NIO Selectorは非ブロッキングI/Oにスレッドを使用しません。 JDK6では、Windowsおよび新しいLinuxカーネルのepoll機能でselect()を使用します。非同期I/Oの場合、スレッドの詳細はフレームワークに依存します。
Java 7が到着したので、新しい答えはFutureクラスのNIO.2です。例:
サーバー側:
final AsynchronousServerSocketChannel serverSocket=
AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection
Future<AsynchronousSocketChannel> future= serverSocket.accept();
final AsynchronousSocketChannel clientSocket= future.get(); // now it's blocking, useful: future.isDone() and .isCancelled()
//Do whatever you want ..
InputStream stream = Channels.newInputStream(clientSocket) (...)
クライアント側:
AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
Future connected = localSocket.connect(ourServerSocketAddress);
// later: if(future.isDone())
connected.get();
//Send something
OutputStream os = Channels.newOutputStream(clientChannel );
os.write (...)
更新:アクターモデルを使用できる場合は、 AKKA TCP IO の方がより適切です。
ライブラリに関する別の提案は、Naga( http://naga.googlecode.com )です。フレームワークのようなものではなく、ライブラリのようなものです。普通のJavaソケットのように見えます。これがあなたのお茶の場合です。Grizzly、Mina、Nettyに比べて最小限です。
Java.nio
は単なるパッケージであり、「ダム」クラスのコレクションであり、それ自体はスレッドを使用しません。 Reactor design pattern などで適切に使用すると、適切で完全にスケーラブルな非同期I/Oを実現できます。
元の質問に、実装は、1つのケースではUnix/LinuxシステムのAsynchronousFileChannelでI/O操作ごとにスレッドを消費するだけです。