Return to site

🍃☕ Forget the 10X DEVELOPER. Build a 10X JAVA APP

Same code. Same blocking call. One property. ~10× less wall time.

· spring

🔸 TLDR

▪️ 1 Tomcat worker thread

▪️ 🔟 concurrent requests

▪️ Each request blocks for 1 second

▪️ With Platform threads: 10.0863 seconds

▪️ With Virtual threads: 1.0652 seconds 🚀

That is roughly 9.5× faster in this benchmark.

And the application code does not need to become reactive.

Section image

🔸 THE BLOCKING ENDPOINT

@GetMapping("/benchmark")
public BenchmarkResult benchmark()
        throws InterruptedException {
    Thread.sleep(1000); // Simulates blocking I/O
    Thread currentThread =
            Thread.currentThread();
    return new BenchmarkResult(
            "Blocking work complete",
            1000,
            currentThread.getName(),
            currentThread.isVirtual());
}

Thread.sleep() represents the kind of waiting we often get from:

▪️ Database calls

▪️ HTTP APIs

▪️ File I/O

▪️ Messaging

▪️ Other blocking operations

With a traditional platform thread, that thread remains unavailable while the request waits.

🔸 FORCE TOMCAT TO ONE WORKER

server.tomcat.threads.max=1

server.tomcat.threads.min-spare=1

Now send 🔟 requests concurrently:

hey -n 10 -c 10 http://localhost:8080/benchmark

With one traditional worker processing ten 1-second blocking requests:

Total: 10.0863 secs

They are effectively processed one after another. 🐌

🔸 ENABLE VIRTUAL THREADS

With Java 21+ and a compatible Spring Boot version:

spring.threads.virtual.enabled=true

Run the exact same benchmark again:

Total: 1.0652 secs

🔥 Nearly all 🔟 blocking requests can now spend their waiting time concurrently.

Instead of tying expensive OS-backed platform threads to blocking operations, Java can park lightweight virtual threads and reuse the underlying carrier threads.

🔸 WHY THIS MATTERS

Virtual threads let you keep the familiar imperative Java programming model:

result = repository.findById(id);

response = apiClient.call(result);

return response;

without requiring you to rewrite everything using reactive chains just to achieve high concurrency.

But there is an important nuance 👇

Virtual threads do not make CPU work 10× faster.

They shine when your application spends significant time waiting on blocking I/O.

🔸 TAKEAWAYS

▪️ Virtual threads dramatically improve scalability for blocking workloads.

▪️ In this deliberately constrained benchmark, ~10 seconds became ~1 second.

▪️ Your synchronous Spring MVC code can stay synchronous.

▪️ They reduce the cost of having many concurrent waiting tasks.

▪️ They are not a magic CPU-performance switch.

▪️ For many traditional Spring Boot applications, virtual threads make thread-per-request attractive again. ☕🚀

#Java #SpringBoot #Spring #VirtualThreads

Go further with Java certification:

Java👇

Spring👇

SpringBook👇

JavaFullstackBook👇