JVM / Java / Threads / Virtual Threads

Virtual Threads

Thousands/millions of threads possible. Simplifies concurrency massively. Much simpler and massively scalable. Perfect for: - REST APIs - DB calls - microservices - messaging systems Not useful for: - heavy CPU tasks - tight computation loops
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class VirtualThreadsExample {
    void main() throws Exception {

        // Java 8 (expensive threads)
        // ==========================
        System.out.println("Platform threads (fixed pool 10):\n");
        long start1 = System.currentTimeMillis();
        ExecutorService executor = Executors.newFixedThreadPool(10);  // Look Here

        for (int i=0; i<100; i++) {
            int taskId = i;
            executor.submit(() -> doWork("T-" + taskId));
        }
        executor.shutdown();
        while (!executor.isTerminated()) {}
        
        long end1 = System.currentTimeMillis();
        System.out.println("\nTime: " + (end1 - start1) + " ms");
        System.out.println("\n============================\n");


        // Java 21 (virtual threads)
        // =========================
        System.out.println("Virtual threads:\n");
        long start2 = System.currentTimeMillis();

        try (var virtualExecutor = Executors.newVirtualThreadPerTaskExecutor()) {  // Look Here
            for (int i=0; i<100; i++) {
                int taskId = i;
                virtualExecutor.submit(() -> doWork("V-" + taskId));
            }
        }

        long end2 = System.currentTimeMillis();
        System.out.println("\nTime: " + (end2 - start2) + " ms");

    }

    
    static void doWork(String name) {
        try {
            System.out.println(name + " START");
            Thread.sleep(1000); // simulate blocking I/O
            System.out.println(name + " END");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/*
    Platform threads (fixed pool 10): 

    T-1 START 
    T-0 START 
    ...
    T-98 END 
    T-99 END 

    Time: 10714 ms

    ============================

    Virtual threads:

    V-0 START 
    V-1 START 
    ...
    V-99 END
    V-98 END

    Time: 1650 ms
*/




References: