web-dev-qa-db-ger.com

Asynchron IO in Java?

Welche Optionen für async io (socket-based) gibt es in Java= other than Java.nio? Verwendet Java.nio auch Threads im Hintergrund (wie ich die async-socket-library von .NET finde) hat, vielleicht wurde es geändert) oder ist es "wahr" asynchron io mit einem richtigen Select-Aufruf?

57
thr

Javas NIO-Paket (ab Java6) bietet Unterstützung für nicht blockierende E/A nur über Selector s. Java7 wird hoffentlich mit NIO.2 ausgeliefert, das auch asynchrone E/A-Unterstützung bietet. Heute ist es am besten, ein Framework zu verwenden. ARMistice erwähnte Mina. Hier sind einige andere.

  1. Grizzly . Dies ist der E/A-Kern für den Server GlassFish von Sun. Grizzly bietet eine Funktion zum Ausführen asynchroner Lese-/Schreibvorgänge (über ein Warteschlangenmodell). Es unterstützt TCP und UDP gleichermaßen. Ich habe Grizzly in einigen Projekten verwendet. Es gibt Dinge, die ich an dem Framework mag und nicht mag, aber im Detail ist dies wirklich ein anderes Thema. Ich werde sagen dass es ziemlich einfach ist, etwas in Betrieb zu nehmen, und Grizzly viel für Sie erledigt.
  2. Netty . Dieses Projekt stammt von einem der Originalautoren des Mina-Projekts. Ich habe dieses nicht verwendet, daher weiß ich nichts über die Unterstützung für asynchrone E/A. Sie sollten einen Blick darauf werfen.

In Bezug auf Ihre Frage zu Threads verwenden NIO Selectors keine Threads für nicht blockierende E/A. In JDK6 verwenden sie select () unter Windows und die epoll-Funktion auf neueren Linux-Kerneln. Für asynchrone E/A hängen die Threading-Details vom Framework ab.

45
JLR

Java 7 ist eingetroffen, daher lautet die neue Antwort NIO.2 mit Future-Klasse. Beispiel

Auf der Serverseite:

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) (...)

Auf Kundenseite:

AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
Future connected = localSocket.connect(ourServerSocketAddress);
// later: if(future.isDone())
connected.get();

//Send something
OutputStream os = Channels.newOutputStream(clientChannel );
os.write (...)

Update: Wenn Sie das Schauspielermodell verwenden können, wäre AKKA TCP IO sogar noch besser .

16

Ein weiterer Vorschlag in Bezug auf libs wäre Naga ( http://naga.googlecode.com ). Es ist ein bisschen weniger wie ein Framework, sondern eher wie eine Bibliothek. Es versucht eher wie die gewöhnlichen Java Sockets auszusehen, wenn das Ihre Tasse Tee ist. Es ist minimalistisch im Vergleich zu Grizzly, Mina und Netty.

15
Nuoji

Java.nio ist nur ein Paket - eine Sammlung von "dummen" Klassen - für sich genommen werden keine Threads verwendet. Bei ordnungsgemäßer Verwendung, z. B. im Reaktordesignmuster , können Sie eine ordnungsgemäße, vollständig skalierbare, asynchrone E/A erzielen.

12
Yuval Adam

Wenn Sie daran interessiert sind, es für Network Stuff zu verwenden. Eine wirklich gute Wahl ist:

http://mina.Apache.org/

Schauen Sie, es ist einfach zu bedienen und sehr leistungsstark.

6
ARMistice

Zur ursprünglichen Frage benötigt die Implementierung nur einen Thread pro E/A-Operation in einem Fall, AsynchronousFileChannel auf Unix/Linux-Systemen.

2
Alan