En tant qu’ingénieur backend, nous sommes confrontés à des situations pour traiter les données de manière asynchrone. Aujourd’hui, voyons comment cela se fait en Java et différentes manières de le faire.

Thread

Le composant très basique mais si puissant de la concurrence Java est Thread. Le Thread de Java est en fait associé au Thread du système d’exploitation. La façon très simple de créer un Thread est en l’étendant et en remplaçant le run :

Le démarrage du thread provoque le run() être appelé.
Tu peux demander; oui, Thread a des tonnes d’autres méthodes qui peuvent être remplacées :

  • Dans la plupart des cas, nous ne voulons pas remplacer les autres méthodes du thread.
  • Une fois que nous étendons le Thread classe, la classe d’extension perd sa capacité à s’étendre davantage car Java ne prend pas en charge les héritages multiples.
  • Chaque thread a son propre objet lorsque nous l’étendons, et ce n’est pas bon pour la santé de la mémoire lorsqu’il y a des tonnes de Objects of the extended Thread établi.

Java résout ces problèmes avec l’interface Runnable. En réalité, Thread a une méthode surchargée qui prend Runnable.

Runnable

Runnable est une interface qui n’a qu’une seule méthode : run(). Oui, Runnable est une interface fonctionnelle et son instance peut être créée avec la fonction lambda. Pourtant, c’est un moyen facile de le faire; pour les choses complexes, nous aimerions peut-être l’implémenter. Voyez la différence ici. Tout dépend de l’exigence :

Bien que Runnable ait un run(), ce n’est pas un Thread mais juste une classe Java jusqu’à ce qu’il soit pris en charge par (transmis à) Thread. Le démarrage du thread provoque l’exécution de l’objet run() être appelé.

Oui, Java l’a résolu dans la version 1.5, et c’est Callable.

Callable<V>

Callable est une interface générique. Pourquoi? L’exécution de cette commande de la valeur de retour en tant que générique exécute cette commande. Callable est aussi une interface fonctionnelle et call() est la seule méthode, une méthode sans argument qui lève une exception et renvoie une valeur générique d’exécution de cette commande.

L’implémentation de Callable est très similaire à Runnable :

Voyez ici, l’appel traite les données et renvoie une valeur qui peut être collectée après l’exécution. Mais y a-t-il une énorme différence à l’invoquer? Nous utilisons ExecutorService invoquer et Future pour retenir le résultat. Parlons pourquoi.

Comme vous pouvez le voir, il n’y a pas de comportement contrôlé de création et d’exécution des Threads (Runnable ou Callable aussi). Nous pouvons vouloir contrôler le nombre de threads exécutés à la fois car chacun d’eux est associé aux threads du système d’exploitation. Le nombre de threads que nous exécutons doit être inférieur au nombre de cœurs de processeur disponibles. Tous ensemble, Java le résout en ExecutorService interface.
Ci-dessus, un article d’information sur Programmation asynchrone en Java : Partie I.
N’hésitez pas à nous contacter via la section des commentaires, au cas où vous auriez des questions concernant les instructions que nous avons partagées ci-dessus.