Virtual Threads (Java 21)
Handle huge numbers of blocking tasks with lightweight JVM-managed threads.
📌 Key IdeaVirtual threads (Project Loom) make thread-per-request practical again for I/O-heavy services. They reduce memory/scheduling overhead vs platform threads, but they are not a magic speed-up for pure CPU-bound work.
Problem it solves
- Platform-thread-per-request models hit scalability limits when many requests block on I/O.
- Thread pools become bottlenecks as blocked workers hold scarce OS threads.
- Virtual threads let you keep simple blocking code while handling much higher concurrent I/O workloads.
Visual
🪶 Platform vs Virtual threads
Platform threads (OS): request -> one heavy OS thread (costly at high count) Virtual threads (JDK scheduler): request -> lightweight virtual thread many virtual threads multiplexed on few carrier OS threads Great for blocking I/O workloads.
When to Use
- High-concurrency services with blocking I/O (DB, HTTP clients).
- Codebases where async callback style hurts readability.
- Migrating from thread-pool bottlenecks caused by blocked workers.
When NOT to Use
- Pure CPU-bound computation pipelines.
- Libraries that pin carrier threads frequently (monitor pinning hot paths).
Code Variations
Virtual-thread-per-task executorjava
try (var exec = Executors.newVirtualThreadPerTaskExecutor()) {
Future<String> f = exec.submit(() -> userClient.fetchName(id)); // blocking OK
return f.get();
}Use structured shutdown and still keep timeouts/cancellation.
Interview Q&A
Quick Cheat Sheet
Best fitI/O-bound, high-concurrency request handling.
Not forCPU-bound throughput gains by itself.
Still neededtimeouts, cancellation, observability.