Java 19 Virtual Thread - Devriez-vous l'utiliser ?

Feb 16 2023
Ce blog est la partie 1 d'une série en 2 parties, expliquant ce que sont les threads virtuels dans Java 19, comment les threads virtuels peuvent améliorer les performances des applications et enfin quelques analyses comparatives à l'aide de threads virtuels. Que sont les threads virtuels : Puisque ChatGPT est le nouveau Google, interrogeons-le sur la définition des "Threads virtuels en Java19" (il a donné des définitions différentes et significatives à chaque fois, bravo aux créateurs de cette beauté !!!) Les threads virtuels sont un type de threads légers en Java 19.

Ce blog est la partie 1 d'une série en 2 parties, expliquant ce que sont les threads virtuels dans Java 19 , comment les threads virtuels peuvent améliorer les performances des applications et enfin quelques analyses comparatives à l'aide de threads virtuels.

Que sont les threads virtuels :

Puisque ChatGPT est le nouveau Google , interrogeons-nous sur la définition de "Threads virtuels en Java19" (il a donné des définitions différentes et significatives à chaque fois, bravo aux créateurs de cette beauté !!!)

Les threads virtuels sont un type de threads légers dans Java 19. Les threads virtuels permettent aux utilisateurs de créer un grand nombre de threads, sans subir la surcharge associée aux threads traditionnels. Les threads virtuels sont gérés par la machine virtuelle Java, ils peuvent donc être réutilisés selon les besoins et permettent des améliorations substantielles des performances par rapport à l'utilisation de threads natifs traditionnels.

P our les amateurs de GoLang , les fils virtuels de la routine ne sont rien d'autre que "Frère d'une autre mère"

Pourquoi les threads virtuels sont utiles

Les threads virtuels Java sont différents des threads de plate-forme d'origine dans le sens où les threads virtuels sont beaucoup plus légers en termes de nombre de ressources (RAM) qu'ils demandent au système pour s'exécuter . Ainsi, vous pouvez avoir beaucoup plus de threads virtuels en cours d'exécution dans vos applications que de threads de plate-forme. Pendant tout ce temps, vous offrant tous les avantages d'un thread de plate-forme normal.

Utilisation des threads virtuels

La création d'un thread virtuel en Java est similaire à la création d'un thread Runnable conventionnel. Cependant, nous utiliserons la classe Executors pour créer newVirtualThreadPerTaskExecutor (), qui démarre un nouveau Thread virtuel pour chaque tâche. Le nombre de threads créés par l'exécuteur est illimité.

Test

Dans ce test, j'appellerai un service externe (qui prend 1 milliseconde pour répondre) et effectuerai l'opération 1 million de fois en utilisant à la fois une plate-forme conventionnelle et des threads virtuels.

Objectif :
comparer le temps nécessaire aux threads virtuels par rapport aux threads conventionnels pour effectuer l'opération 1 million de fois.
Spécifications de la machine : 10 cœurs, 16 Go de mémoire.

Code :

Filetages conventionnels

Je ne pouvais plus utiliser qu'un maximum de 1000 threads et j'obtenais une erreur OOM.

Fils virtuels

Résultats :

Vous trouverez ci-dessous l'utilisation du processeur + le temps pris par les deux approches pour exécuter la boucle for externe 10 fois.

Filetages conventionnels

Zoomez pour voir

Fils virtuels

Zoomez pour voir

Conclusion :

La différence de temps entre l'utilisation des threads conventionnels et virtuels nous donne un gagnant clair pour l'utilisation des threads virtuels au cas où nous attendrions un service externe. Si nous extrapolons cet exemple à 10 millions ou 100 millions d'appels, la différence devient beaucoup plus importante et les threads virtuels apparaissent comme les plus performants lorsque l'application est impliquée dans l'attente d'une application externe.

L'exemple imitait l'appel d'un service externe en utilisant Thread.sleep(), qui peut être remplacé par un appel réel à un service externe. Ceci est laissé en exercice au lecteur. FAIS-LE!!!

NOTE : Il est vrai que par essais et erreurs, nous pouvons optimiser sur le nombre de création de threads conventionnels, bien qu'il ne soit pas possible de prédire le nombre parfait de threads pour chaque cas d'utilisation (si vous conservez au hasard un pool avec des threads plus élevés , vous gaspillez inutilement des ressources d'application). L'utilisation d'une allocation dynamique de threads (threads virtuels) a beaucoup plus de sens dans une application du monde réel.

Problèmes d'utilisation des threads virtuels

L'exemple ci-dessus vient de vous faire réaliser que le thread virtuel est la bonne affaire, et afin d'accélérer vos applications et pour une utilisation optimale de votre CPU, nous devons toujours créer des threads virtuels.

Si seulement, tout n'était pas accompagné d'un « MAIS ».

Les threads virtuels en Java sont excellents, mais si votre application n'est pas liée aux E/S, c'est-à-dire si le processeur lui-même doit effectuer un traitement lourd (comme former un modèle ou compter jusqu'à 100 millions), l'utilisation de threads virtuels n'est pas le choix idéal.

Les détails en seront donnés dans la 2ème partie de cet article. Restez à l'écoute!!!

Dernières pensées

L'introduction de Java 19 dans les systèmes est encore en phase de développement (puisque le projet Loom n'est pour l'instant qu'en phase de prévisualisation), bien que nous nous attendions à voir d'énormes améliorations dans la gestion des serveurs, des temps de réponse API plus rapides et des problèmes OOM moins fréquents.

A propos de l'auteur :

Yash Bansal est ingénieur principal associé chez RedBus. Plus d'informations sur lui peuvent être trouvées sur son profil LinkedIn .