import java.time.Duration; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; /** JEP 444 (final): 10,000 blocking tasks on virtual threads. Timing is machine dependent, so only counts are asserted. */ public class VirtualThreadsDemo { public static void main(String[] args) throws Exception { AtomicInteger done = new AtomicInteger(); long t0 = System.nanoTime(); try (ExecutorService ex = Executors.newVirtualThreadPerTaskExecutor()) { for (int i = 0; i < 10_000; i++) ex.submit(() -> { Thread.sleep(Duration.ofSeconds(1)); done.incrementAndGet(); return null; }); } long ms = (System.nanoTime() - t0) / 1_000_000; System.out.println("tasks completed : " + done.get()); System.out.println("finished in < 5s: " + (ms < 5_000) + " (10,000 x 1s sleeps)"); Thread v = Thread.ofVirtual().name("demo-vt").start(() -> System.out.println("isVirtual : " + Thread.currentThread().isVirtual() + ", daemon=" + Thread.currentThread().isDaemon())); v.join(); Thread p = Thread.ofPlatform().name("demo-pt").start(() -> System.out.println("platform isVirtual: " + Thread.currentThread().isVirtual())); p.join(); } }