212. Using the ExecutorService for virtual threads
Virtual threads allow us to write more expressive and straightforward concurrent code. Thanks to the massive throughput obtained via virtual threads, we can easily adopt the task-per-thread model (for an HTTP server, this means a request per thread, for a database, this means a transaction per thread, and so on). In other words, we can assign a new virtual thread for each concurrent task.
Trying to use the task-per-thread model with platform threads will result in a throughput limited by the number of hardware cores – this is explained by Little’s law (https://en.wikipedia.org/wiki/Little%27s_law), L = λW, or throughput equals average concurrency multiplied by latency.
Whenever possible, it is recommended to avoid interacting with threads directly. JDK sustains this via the ExecutorService
/Executor
API. More precisely, we are used to submitting a task (Runnable
/Callable
) to an ExecutorService
/Executor
...