Les threads virtuels Java sont une nouvelle fonctionnalité introduite dans JDK 19. Il a le potentiel d’améliorer la disponibilité et la qualité du code d’une application en plus de réduire la consommation de mémoire. Cet article a pour but de présenter les threads virtuels Java d’une manière facilement compréhensible.
Vidéo: Pour voir la présentation visuelle de cet article, cliquez ci-dessous :
Cycle de vie des threads
Fig : Cycle de vie typique d’un filetage
Passons en revue le cycle de vie typique d’un thread :
- Le thread est créé dans un pool de threads
- Le thread attend dans le pool qu’une nouvelle demande arrive
- Une fois la nouvelle demande arrivée, le thread récupère la demande et effectue un appel de base de données backend pour traiter cette demande.
- Le thread attend une réponse de la base de données principale
- Une fois que la réponse revient de la base de données, le thread la traite et renvoie la réponse au client
- Le thread est renvoyé dans le pool de threads
Les étapes 2 à 6 se répéteront jusqu’à la fermeture de l’application.
Si vous remarquez, le fil ne fait réellement un vrai travail qu’aux étapes 3 et 5. Dans toutes les autres étapes (c’est-à-dire, l’étape #1, l’étape #2, l’étape #4, l’étape #6), il attend essentiellement (ou ne fait rien). Dans la plupart des applications, un nombre important de threads principalement attend pendant la plus grande partie de sa durée de vie.
Architecture des threads de plate-forme

Fig : Chaque thread de la plate-forme est mappé à un thread du système d’exploitation
Dans la version précédente de JVM (Java Virtual Machine), il n’y avait qu’un seul type de thread. C’est ce qu’on appelle un fil « classique » ou « plate-forme ». Chaque fois qu’un thread de plate-forme est créé, un thread du système d’exploitation lui est alloué. Ce n’est que lorsque le thread de la plate-forme quitte (c’est-à-dire qu’il meurt) la JVM que ce thread du système d’exploitation est libre d’effectuer d’autres tâches. Jusque-là, il ne peut pas effectuer d’autres tâches. Fondamentalement, il existe un mappage 1: 1 entre un thread de plate-forme et un thread de système d’exploitation.
Selon cette architecture, le thread du système d’exploitation sera inutilement verrouillé à l’étape #1, étape #2, étape #4, étape #6 du cycle de vie du thread, même s’il ne fait rien pendant ces étapes. Étant donné que les threads du système d’exploitation sont des ressources précieuses et finies, le temps est largement perdu dans cette architecture de threads de plate-forme.
Architecture des threads virtuels

Fig : les threads du système d’exploitation ne sont pas alloués aux threads de la plate-forme tant que le travail réel n’a pas besoin d’être exécuté

Fig : Les threads virtuels sont mappés sur les threads de la plate-forme lorsqu’ils effectuent un travail réel
Afin d’utiliser efficacement les threads sous-jacents du système d’exploitation, des threads virtuels ont été introduits dans JDK 19. Dans cette nouvelle architecture, un thread virtuel sera affecté à un thread de plate-forme (alias fil porteur) uniquement lorsqu’il exécute un travail réel. Conformément au cycle de vie du thread décrit ci-dessus, ce n’est qu’au cours des étapes 3 et 5 que le thread virtuel sera affecté au thread de la plate-forme (qui à son tour utilise le thread du système d’exploitation) pour exécution. Dans toutes les autres étapes, le thread virtuel résidera en tant qu’objets dans la région de mémoire de tas Java, tout comme n’importe lequel de vos objets d’application. Ainsi, ils sont légers et plus efficaces.
Qu’est-ce que ‘Stack Chunk Object’?
Lorsqu’un thread virtuel n’exécute pas un travail réel et réside dans une région de mémoire de tas Java, il est appelé « objet de bloc de pile ».
Comment créer des threads virtuels ?
Toutes les API qui fonctionnent avec les threads de plate-forme actuels fonctionneront avec les threads virtuels comme si. Cependant, les API pour créer des threads virtuels Java sont légèrement différentes. Vous trouverez ci-dessous un exemple de programme qui crée un thread virtuel Java :
1:
2: Runnable task = () -> { System.out.println("Hello Virtual Thread!"); };
3:
4: Thread.startVirtualThread(task);
Dans cet exemple de programme, le thread virtuel est créé à l’aide de ‘Thread.startVirtualThread()’ API. C’est l’API la plus simple pour créer des threads virtuels Java. Si vous remarquez, dans le programme ci-dessus à la ligne 4, nous invoquons Thread.startVirtualThread()
méthode en passant un objet Runnable comme argument, qui est créé à la ligne #2.
Vous pouvez également créer des threads virtuels Java à l’aide des API suivantes :
Thread.ofVirtual().start(Runnable)
;Thread.ofVirtual().unstarted(Runnable)
;Executors.newVirtualThreadPerTaskExecutor()
;Executors.newThreadPerTaskExecutor(ThreadFactory)
;- Plus de détails sur ces API peuvent être trouvés dans cet article.
Avantages des threads virtuels Java
En raison de son architecture élégante, les threads virtuels offrent plusieurs avantages :
- Améliore la disponibilité des applications
- Améliore le débit des applications
- Réduit
OutOfMemoryError: unable to create new native thread
- Réduit la consommation de mémoire des applications
- Améliore la qualité du code
- 100 % compatible avec les fils de plate-forme
- Pour en savoir plus sur ces avantages en détail, vous pouvez lire cet article.
Quel est l’impact des threads virtuels sur les performances ?
Les threads virtuels Java sont beaucoup plus légers que les threads de plate-forme. Pour en savoir plus sur l’impact sur les performances des threads virtuels Java, vous pouvez vous référer aux études réalisées ici. Cependant, en quelques mots :
- Si votre application a beaucoup de threads ou une grande taille de pile (c’est-à-dire -Xss), le passage aux threads virtuels réduira la consommation de mémoire de votre application.
- Si votre application crée fréquemment de nouveaux threads (au lieu d’exploiter le pool de threads), le passage aux threads virtuels peut améliorer le temps de réponse de votre application.
Conclusion
Nous espérons que cet article vous a aidé à mieux comprendre les threads virtuels Java – un merveilleux ajout à notre langage de programmation Java phénoménal.