Java : les threads virtuels arrivent avec JDK 21

Par:
fredericmazue

mar, 11/04/2023 - 15:12

La proposition JEP 444 a été promue du statut de 'Candidate' à celui de 'Proposed to Target' pour JDK 21. JEP 444 définit les threads virtuels à la suite de JEP 425 et JEP 436 qui avaient abouti à une avant-première de ceux-ci dans JDK 19 et JDK 20 respectivement. Les threads virtuels seront donc une fonctionnalité utilisable en production avec JDK 21.

Les threads virtuels viennent repousser une limitation induite par les threads classiques de Java. En effet ceux-ci s'appuient sur sur le système d'exploitation sous jacent, ce qui limite leur nombre à quelques milliers d'instance simultanées. Les threads virtuels, qui rappellent les processus du langage Erlang dédié à la programmation concurrente, sont totalement internes à la JVM, et de ce fait il est possible d'en instancier des millions.

JEP 444 apportent des évolutions aux threads virtuels des versions précédentes. Ainsi les threads virtuels prennent désormais en charge les variables locales de thread tout le temps. Il n'est plus possible, comme c'était le cas dans les versions préliminaires, de créer des threads virtuels qui ne peuvent pas avoir de variables locales de thread. La prise en charge garantie des variables locales de thread assure que de nombreuses autres bibliothèques existantes peuvent être utilisées sans modification avec les threads virtuels et facilite la migration du code orienté tâche pour utiliser les threads virtuels.

Cette arrivée des threads virtuels induit de nombreux changements dans les API Java. Par exemple, le package java.util.concurrent inclut désormais la prise en charge des threads virtuels. L'API LockSupport a été mise à jour pour parquer et déparquer les threads virtuels et permettre ainsi aux API qui utilisent LockSupport, telles que les verrous , les sémaphores et les files d'attente de blocage, de fonctionner de manière transparente avec les threads virtuels. Le package java.io a été mis à jour également.

La JNI (Java Native Interface) est dotée d'une nouvelle fonction, IsVirtualThread, pour tester si un objet est un thread virtuel. JDK Flight Recorder (JFR) prend désormais en charge les threads virtuels avec de nouveaux événements tels que jdk.VirtualThreadStart, jdk.VirtualThreadEnd, jdk.VirtualThreadPinned et jdk.VirtualThreadSubmitFailed.

Par contre Java Management Extensions ( JMX ) ne continue à prendre en charge que les threads de plate-forme, ou threads classiques.