Java Academy · Les

Virtuele threads maken

Thread.ofVirtual en executors

Les 2 van 413 stappen

Virtuele threads maken is een gratis Java Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

Manieren om virtuele threads te maken

Java biedt verschillende toegangspunten om virtuele threads te maken. De twee belangrijkste zijn de Thread.ofVirtual()-builder en de fabriek Executors.newVirtualThreadPerTaskExecutor().

In deze les behandelen we ze allemaal.

De builder: start

Thread.ofVirtual() retourneert een builder. Met .start(runnable) maak je de thread en start je die onmiddellijk.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t = Thread.ofVirtual().start(() ->
            System.out.println("Started directly"));
        t.join();
    }
}

De builder: unstarted

Gebruik .unstarted(runnable) als je de thread wilt configureren en die pas later wilt starten.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t = Thread.ofVirtual().unstarted(() ->
            System.out.println("Started later"));
        System.out.println("Before start, alive? " + t.isAlive());
        t.start();
        t.join();
    }
}

Een herbruikbare fabriek

De builder kan via .factory() een ThreadFactory maken. Elke aanroep van newThread levert een nieuwe virtuele thread op.

import java.util.concurrent.ThreadFactory;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        ThreadFactory factory = Thread.ofVirtual().name("job-", 0).factory();
        Thread a = factory.newThread(() ->
            System.out.println(Thread.currentThread().getName()));
        Thread b = factory.newThread(() ->
            System.out.println(Thread.currentThread().getName()));
        a.start(); b.start();
        a.join(); b.join();
    }
}

De handige methode

Thread.startVirtualThread(runnable) is een afkorting waarmee je in één aanroep een naamloze virtuele thread maakt en start.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t = Thread.startVirtualThread(() ->
            System.out.println("One-liner virtual thread"));
        t.join();
    }
}

De executorbenadering

Geef voor taakgerichte code de voorkeur aan Executors.newVirtualThreadPerTaskExecutor(). Deze maakt voor elke ingediende taak een nieuwe virtuele thread.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            exec.submit(() -> System.out.println("task one"));
            exec.submit(() -> System.out.println("task two"));
        }
        System.out.println("All tasks submitted and completed");
    }
}

Waarom try-met-resources

Sinds Java 19 implementeert ExecutorService AutoCloseable. Als je deze in een blok met try-met-resources sluit, wacht hij tot alle ingediende taken klaar zijn.

Zo krijg je een nette, gestructureerde afsluiting zonder handmatige aanroepen van shutdown en awaitTermination.

Veel taken indienen

De executor per taak verwerkt moeiteloos enorme aantallen taken. Elke taak krijgt een eigen virtuele thread.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) {
        AtomicInteger sum = new AtomicInteger();
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 1; i <= 1000; i++) {
                final int n = i;
                exec.submit(() -> sum.addAndGet(n));
            }
        }
        System.out.println("Sum 1..1000 = " + sum.get());
    }
}

Resultaten verzamelen met Future

submit retourneert een Future, zodat je retourwaarden net als met elke andere executor kunt verzamelen.

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws Exception {
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            Future<Integer> f = exec.submit(() -> 6 * 7);
            System.out.println("Result: " + f.get());
        }
    }
}

Builder versus executor

Kies op basis van je bedoeling:

  • Builder / startVirtualThread voor eenmalige threads of aangepaste namen
  • newVirtualThreadPerTaskExecutor voor het indienen van verzamelingen taken en het verzamelen van resultaten

Beide maken één virtuele thread per werkeenheid, precies wat je nodig hebt.

Sla een virtuele executor nooit op

Gebruik niet steeds dezelfde executor voor virtuele threads alsof het een vaste pool met werkers is. Je kunt de executor zelf prima hergebruiken, maar onthoud dat elke taak een volledig nieuwe thread start.

Het punt is: de threads worden niet gepoold; alleen het indienen van taken wordt eenvoudiger gemaakt.

Korte controle

Kies de beste manier om een grote reeks taken uit te voeren, elk op een eigen virtuele thread.

Samenvatting

Je weet nu hoe je virtuele threads maakt:

  • Thread.ofVirtual().start(...) en .unstarted(...)
  • De eenregelige aanroep Thread.startVirtualThread(...)
  • .factory() voor een herbruikbare ThreadFactory
  • Executors.newVirtualThreadPerTaskExecutor() met try-met-resources

Hierna: kiezen tussen platformthreads en virtuele threads.

Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Virtuele threads maken” gratis?

Ja — de volledige tekst van “Virtuele threads maken” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Virtuele threads maken”?

Thread.ofVirtual en executors Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Virtuele threads maken”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Wat zijn virtuele threads
  2. Virtuele threads maken
  3. Platformthreads versus virtuele threads
  4. Valkuilen: pinning en ThreadLocals
← Terug naar Java Academy