Quelles options pour async io (basé sur socket) existe-t-il dans Java autre que Java.nio? (peut-être que cela a été changé) ou est-ce "vrai" async io en utilisant un appel de sélection approprié?
Le package NIO de Java (à partir de Java6), prend en charge uniquement E/S non bloquantes, via Sélecteur s. Nous espérons que Java7 sera livré avec NIO.2, qui inclut la prise en charge des E/S asynchrones. Aujourd'hui, votre meilleur pari est d'utiliser un cadre. ARMistice a mentionné Mina. En voici d'autres.
Maintenant, en ce qui concerne votre question sur les threads, les sélecteurs NIO n'utilisent pas de threads pour les E/S non bloquantes. Dans JDK6, ils utilisent select () sous Windows et la fonction epoll sur les noyaux Linux plus récents. Pour les E/S asynchrones, les détails de threading dépendent du framework.
Java 7 est arrivé, la nouvelle réponse est NIO.2 avec la classe Future. Exemple :
Côté serveur:
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) (...)
Côté client:
AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
Future connected = localSocket.connect(ourServerSocketAddress);
// later: if(future.isDone())
connected.get();
//Send something
OutputStream os = Channels.newOutputStream(clientChannel );
os.write (...)
Mise à jour: Si vous pouvez utiliser le modèle d'acteur alors AKKA TCP IO serait encore mieux .
Une autre suggestion concernant les bibliothèques serait Naga ( http://naga.googlecode.com ). C'est un peu moins comme un framework et plus comme une bibliothèque. Il essaie de ressembler davantage aux prises ordinaires Java, si c'est votre tasse de thé. Il est minimaliste par rapport à Grizzly, Mina et Netty.
Java.nio
n'est qu'un paquetage - une collection de classes "stupides" - en soi, il n'utilise aucune utilisation de threads. Lorsqu'il est utilisé correctement, comme dans le modèle de conception du réacteur , vous pouvez obtenir des E/S asynchrones appropriées, entièrement évolutives.
Si vous souhaitez l'utiliser pour Network Stuff. Un très bon choix est:
Jetez-y un œil, c'est facile à utiliser et très puissant.
À la question d'origine, l'implémentation ne consomme qu'un thread par opération d'E/S dans un cas, AsynchronousFileChannel sur les systèmes Unix/Linux.