Guide des API de canal asynchrone Java NIO2

Guide des API de canal asynchrone Java NIO2

1. Vue d'ensemble

Dans cet article, nous allons explorer les fondations de l'une des principales API supplémentaires des nouvelles E / S (NIO2) en Java 7-asynchronous channel APIs.

Ceci est le premier d'une série d'articles qui couvriront ce sujet particulier.

Les API de canal asynchrone constituent une amélioration par rapport aux anciennes API NIO (I / O) fournies avec Java 1.4. Pour en savoir plus sur les sélecteurs NIO, veuillez suivrethis link.

Une autre amélioration des API NIO est la nouvelle API de système de fichiers. Vous pouvez en savoir plus sur sesfile operations etpath operations sur ce site également.

Pour utiliser les canaux asynchrones NIO2 dans nos projets, nous devons importer le packagejava.nio.channels car les classes requises y sont regroupées:

import java.nio.channels.*;

2. Fonctionnement des API de canal asynchrone

Les API de canal asynchrone ont été introduites dans le packagejava.nio.channels existant, simplement - en préfixant les noms de classe avec le motAsynchronous.

Certaines des classes principales incluent:AsynchronousSocketChannel,AsynchronousServerSocketChannel etAsynchronousFileChannel.

Comme vous l'avez peut-être remarqué, le style de ces classes est similaire à celui des API de canal NIO standard.

De plus, la plupart des opérations d'API disponibles pour les classes de canaux NIO sont également disponibles dans les nouvelles versions asynchrones. La principale différence est quethe new channels enable some operations to be executed asynchronously.

Lorsqu'une opération est lancée, les API de canal asynchrone nous fournissent deux alternatives pour surveiller et contrôler les opérations en attente. L'opération peut retourner l'objetjava.util.concurrent.Future ou nous pouvons lui passer un objetjava.nio.channels.CompletionHandler.

3. L'approcheFuture

A Future object represents a result of an asynchronous computation. En supposant que nous voulons créer un serveur pour écouter les connexions client, nous appelons l'API statiqueopen sur leAsynchronousServerSocketChannel et lions éventuellement le canal de socket retourné à une adresse:

AsynchronousServerSocketChannel server
  = AsynchronousServerSocketChannel.open().bind(null);

Nous avons passé ennull pour que le système puisse attribuer automatiquement une adresse. Ensuite, nous appelons la méthodeaccept sur le serveur renvoyéSocketChannel:

Future future = server.accept();

Lorsque nous appelons la méthodeaccept d'unServerSocketChannel dans l'ancien IO, elle se bloque jusqu'à ce qu'une connexion entrante soit reçue d'un client. Mais la méthodeaccept d'unAsynchronousServerSocketChannel renvoie tout de suite un objetFuture.

Le type générique de l'objetFuture est le type de retour de l'opération. Dans notre cas ci-dessus, il s'agit deAsynchronousSocketChannel mais cela aurait tout aussi bien pu êtreInteger ouString, selon le type de retour ultime de l'opération.

Nous pouvons utiliser l'objetFuture pour interroger l'état de l'opération:

future.isDone();

Cette API renvoietrue si l'opération sous-jacente est déjà terminée. Notez que dans ce cas, l'achèvement peut signifier une interruption normale, une exception ou une annulation.

Nous pouvons également vérifier explicitement si l'opération a été annulée:

future.isCancelled();

Il ne renvoietrue que si l'opération a été annulée avant de se terminer normalement, sinon, il renvoiefalse. L'annulation est effectuée par la méthodecancel:

future.cancel(true);

L'appel annule l'opération représentée par l'objetFuture. Le paramètre indique que même si l'opération a démarré, elle peut être interrompue. Une fois qu'une opération est terminée, elle ne peut pas être annulée.

Pour récupérer le résultat d'un calcul, nous utilisons la méthodeget:

AsynchronousSocketChannel client= future.get();

Si nous appelons cette API avant la fin de l'opération, elle sera bloquée jusqu'à son achèvement et renverra ensuite le résultat de l'opération.

4. L'approcheCompletionHandler

L'alternative à l'utilisation de Future pour gérer les opérations est un mécanisme de rappel utilisant la classeCompletionHandler. Les canaux asynchrones permettent à un gestionnaire d'achèvement d'être spécifié pour consommer le résultat d'une opération:

AsynchronousServerSocketChannel listener
  = AsynchronousServerSocketChannel.open().bind(null);

listener.accept(
  attachment, new CompletionHandler() {
    public void completed(
      AsynchronousSocketChannel client, Object attachment) {
          // do whatever with client
      }
    public void failed(Throwable exc, Object attachment) {
          // handle failure
      }
  });

L'API de rappel decompleted est appelée lorsque l'opération d'E / S se termine avec succès. Le rappel defailed est appelé si l'opération a échoué.

Ces méthodes de rappel acceptent d'autres paramètres - pour nous permettre de transmettre toutes les données que nous estimons appropriées pour être marquées avec l'opération. Ce premier paramètre est disponible en tant que deuxième paramètre de la méthode de rappel.

Enfin, un scénario clair consiste à utiliser les mêmesCompletionHandler pour différentes opérations asynchrones. Dans ce cas, nous gagnerions à baliser chaque opération pour fournir un contexte lors de la gestion des résultats, nous verrons cela en action dans la section suivante.

5. Conclusion

Dans cet article, nous avons examiné les aspects introductifs des API de canal asynchrone de Java NIO2.

Pour obtenir tous les extraits de code et le code source complet de cet article, vous pouvez visiter lesGitHub project.