Java kan virtuele threads krijgen
- November 30, 2021
- 0
OpenJDK-conceptvoorstel zou gelijktijdig programmeren veel gemakkelijker maken, terwijl het efficiënter gebruik maakt van hardware-bronnen.
Er worden virtuele threads voorgesteld voor Java, in een poging om de inspanning die nodig is voor het schrijven, onderhouden en observeren van gelijktijdige applicaties met hoge doorvoer drastisch te verminderen.
Een concept JDK Enhancement Proposal (JEP) van Oracle, dat deze week is ingediend, roept op tot een preview van virtuele threads als onderdeel van de standaardeditie van Java. Virtuele threads zouden de platformthreads van Java, die threads van het besturingssysteem vertegenwoordigen, aanvullen met een lichtgewicht implementatie van threads in gebruikersmodus die efficiënter gebruik zou maken van beschikbare hardware, tegen drastisch lagere kosten.
Het conceptvoorstel stelt dat Threads handig zijn om een eenheid van gelijktijdigheid weer te geven, zoals een transactie. Java’s huidige implementatie van Thread verbruikt een OS-thread voor elke Java-thread, en OS-threads zijn schaars en kostbaar. Een moderne server kan veel meer gelijktijdige transacties aan dan OS-threads.
Ontwikkelaars die serversoftware met hoge doorvoer schrijven, moesten threads tussen transacties delen om efficiënt gebruik te maken van hardware. Dit werd gedaan met behulp van threadpools die threads aan de ene transactie na de andere zouden lenen om te besparen op de kosten van het maken van threads voor elke transactie. Toen dit niet genoeg was, begonnen ontwikkelaars threads terug te sturen naar de pool, zelfs midden in een transactie, terwijl ze op I/O wachtten. Dit resulteert in een asynchrone programmeerstijl die een afzonderlijke, incompatibele set API’s vereist en die het oplossen van problemen, debuggen, observatie en profilering erg moeilijk maakt.
Virtuele threads, implementaties in gebruikersmodus van java.lang.Thread die de OS-threads niet blokkeren, maken een bijna optimaal hardwaregebruik mogelijk. Virtuele threads maken een hoge mate van gelijktijdigheid mogelijk, samen met een hoge doorvoer, terwijl het programma harmonieus blijft met het op threads gebaseerde ontwerp van het Java-platform en de tools. Virtuele threads zijn voor platformthreads wat virtueel geheugen is voor fysiek RAM: een mechanisme dat een overvloedige “virtuele” bron biedt via een automatische toewijzing aan de onderliggende fysieke bron.
Het is niet nodig om een nieuw programmeermodel te leren om virtuele threads te gebruiken, stelt het voorstel. Ontwikkelaars die Java gebruiken om gelijktijdige applicaties te schrijven, kennen het model al. Ontwikkelaars zouden echter oude gewoonten moeten afleren die uit noodzaak zijn ontstaan vanwege de hoge kosten van threads, met name het gebruik van threadpools die alleen nuttig zijn wanneer de bron die ze poolen schaars of duur is om te creëren.
Virtuele threads zijn instanties van java.lang.Thread die door de JDK zijn geïmplementeerd in een zodanige kwestie dat veel actieve instanties naast elkaar kunnen bestaan in hetzelfde proces. De semantiek van virtuele threads is identiek aan platformthreads, behalve dat ze tot een enkele ThreadGroup behoren en niet kunnen worden opgesomd.