Running 5000 tasks that each sleep 50ms. sample task thread: VirtualThread[#22]/runnable@ForkJoinPool-1-worker-1 newVirtualThreadPerTaskExecutor(): 5000/5000 tasks completed in 121ms (121ms is close to the 50ms a single task takes - every task ran concurrently, nothing waited for a free worker) sample task thread: Thread[#5027,pool-1-thread-1,5,main] newFixedThreadPool(20): 5000/5000 tasks completed in 12556ms (12556ms is roughly 250 rounds of 50ms each - only 20 tasks are ever running at once) done