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?
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.
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.
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 .
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.
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.
Wenn Sie daran interessiert sind, es für Network Stuff zu verwenden. Eine wirklich gute Wahl ist:
Schauen Sie, es ist einfach zu bedienen und sehr leistungsstark.
Zur ursprünglichen Frage benötigt die Implementierung nur einen Thread pro E/A-Operation in einem Fall, AsynchronousFileChannel auf Unix/Linux-Systemen.