web-dev-qa-db-ja.com

非同期IO Javaで?

Java.nio以外のJavaには、非同期io(ソケットベース)のオプションはありますか?また、Java.nioはバックグラウンドでスレッドを使用しますか(.NETのasync-socket-libraryと同様に、おそらく変更されていると思います)、または適切なselect呼び出しを使用して「true」の非同期ioですか?

57
thr

JavaのNIOパッケージ(Java6以降)は、 Selector sを介して、ノンブロッキングI/Oのみをサポートします。 Java7は、非同期I/Oサポートを含むNIO.2とともに出荷される予定です。今日、あなたの最善の策はフレームワークを利用することです。 ARMisticeはMinaに言及しました。他にもいくつかあります。

  1. グリズリー 。これは、Sunの GlassFish サーバーのI/Oコアです。 Grizzlyは、非同期の読み取り/書き込みを(キューモデルを介して)行う機能を提供します。それはTCPとUDPを同様にサポートします。私はいくつかのプロジェクトでGrizzlyを使用しました。フレームワークに関して好きなものと嫌いなものがあります。何かを実行するのは非常に簡単であり、Grizzlyがあなたのために多くの面倒な作業を行うということです。
  2. Netty 。このプロジェクトは、Minaプロジェクトの元の著者の1人から来ています。私はこれを使用していませんので、非同期I/Oのサポートについては知りません。ご覧ください。

さて、スレッドに関するあなたの質問に関して、NIO Selectorは非ブロッキングI/Oにスレッドを使用しません。 JDK6では、Windowsおよび新しいLinuxカーネルのepoll機能でselect()を使用します。非同期I/Oの場合、スレッドの詳細はフレームワークに依存します。

45
JLR

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 の方がより適切です。

16

ライブラリに関する別の提案は、Naga( http://naga.googlecode.com )です。フレームワークのようなものではなく、ライブラリのようなものです。普通のJavaソケットのように見えます。これがあなたのお茶の場合です。Grizzly、Mina、Nettyに比べて最小限です。

15
Nuoji

Java.nioは単なるパッケージであり、「ダム」クラスのコレクションであり、それ自体はスレッドを使用しません。 Reactor design pattern などで適切に使用すると、適切で完全にスケーラブルな非同期I/Oを実現できます。

12
Yuval Adam

Network Stuffに使用することに興味がある場合。本当に良い選択は:

http://mina.Apache.org/

使い方が簡単で非常に強力です。

6
ARMistice

元の質問に、実装は、1つのケースではUnix/LinuxシステムのAsynchronousFileChannelでI/O操作ごとにスレッドを消費するだけです。

2
Alan