Déposée cette semaine, la proposition d'amélioration du JDK (JEP) d'Oracle prévoit l'intégration de threads (unité d’exécution) virtuels dans l'édition standard de Java (Java SE). Ils réduiraient considérablement les efforts requis pour écrire, maintenir et observer des applications concurrentes à haute performance.

Par ailleurs, ils viendraient compléter ceux de Java par une implémentation légère des threads en mode utilisateur. Cette implémentation utiliserait plus efficacement le hardware disponible, ce qui réduirait considérablement les coûts. Selon la proposition, les threads sont utiles pour représenter une unité d’application concurrente, comme une transaction. L'implémentation actuelle de Thread dans Java consomme un thread OS pour chaque thread Java, or les threads OS sont rares et coûteux.

Un niveau élevé de concurrence

Un serveur moderne peut gérer des ordres de grandeur plus importants de transactions concurrentes que de threads OS. Pour utiliser efficacement le hardware, les développeurs de services haut débit devaient partager les threads entre les transactions. Pour y parvenir, ils utilisaient des pools de threads qui prêtaient des threads à une transaction après l'autre afin d'économiser le coût de la création de threads pour chacune d'elles. Mais, comme ça ne suffisait plus, ces derniers ont commencé à renvoyer les threads dans le pool même au milieu d'une transaction, quand ils attendaient des entrées/sorties. Ce style de programmation asynchrone nécessite un ensemble d'API distinct et incompatible qui rend très difficile le dépannage, le débogage, l'observation et le profilage.

Les threads virtuels sont des implémentations en mode utilisateur de java.lang.Thread qui ne bloquent pas les threads du système d'exploitation, et facilitent un usage quasi optimal du hardware. Les threads virtuels apportent un niveau élevé de concurrence, ainsi qu'un débit élevé, tandis que le programme reste en harmonie avec le design basé sur les threads de la plate-forme et des outils Java. Les threads virtuels sont aux threads de la plate-forme ce que la mémoire virtuelle est à la RAM physique : un mécanisme qui offre une ressource « virtuelle » abondante par le biais d'une correspondance automatique avec la ressource physique sous-jacente.

Un apprentissage rapide, mais un changement de pratiques à adopter

Selon la proposition, il n'est pas nécessaire d'apprendre un nouveau modèle de programmation pour utiliser les threads virtuels. Les développeurs qui utilisent Java pour écrire des applications concurrentes connaissent déjà le modèle. Cependant, les développeurs devront oublier les anciennes pratiques mises en œuvre par nécessité en raison du coût élevé des threads, en particulier l'utilisation de pools de threads qui ne sont utiles que lorsque la ressource qu'ils mettent en commun est rare ou coûteuse à créer.

Les threads virtuels sont des instances de java.lang.Thread implémentées par le JDK de manière à faire coexister plusieurs instances actives dans un même processus. La sémantique des threads virtuels est identique à celle des threads de la plate-forme, sauf qu'ils appartiennent à un seul ThreadGroup et ne peuvent pas être énumérés. La proposition, rédigée par Ron Pressler et Alan Bateman, tous deux membres consultants de l'équipe technique d'Oracle, ne précise pas quelle version de Java SE pourrait inclure des threads virtuels. La version actuelle du JDK, livrée en septembre, est le JDK 17.