web-dev-qa-db-fra.com

Asynchrone IO en Java?

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é?

57
thr

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.

  1. Grizzly . Il s'agit du cœur d'E/S du serveur GlassFish de Sun. Grizzly fournit une fonction pour effectuer des lectures/écritures asynchrones (via un modèle de file d'attente). Il prend en charge TCP et UDP. J'ai utilisé Grizzly dans quelques projets. Il y a des choses que j'aime et que je n'aime pas dans le framework, mais pour détailler c'est vraiment un autre sujet. Je dirai qu'il est assez facile de faire fonctionner quelque chose et Grizzly fait beaucoup de travail lourd pour vous.
  2. Netty . Ce projet provient d'un des auteurs originaux du projet Mina. Je n'ai pas utilisé celui-ci, donc je ne connais pas son support pour les E/S asynchrones. Tu devrais y jeter un œil.

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.

45
JLR

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 .

16
Waldemar Wosiński

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.

15
Nuoji

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.

12
Yuval Adam

Si vous souhaitez l'utiliser pour Network Stuff. Un très bon choix est:

http://mina.Apache.org/

Jetez-y un œil, c'est facile à utiliser et très puissant.

6
ARMistice

À 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.

2
Alan