O framework Executor gerencia pools de threads para que você envie tarefas em vez de criar threads manualmente, e CompletableFuture compõe operações assíncronas de forma declarativa. Juntos, são a forma moderna de fazer trabalho concorrente/assíncrono em Java — evitando o custo e a complexidade do gerenciamento raw de threads.
O problema com threads raw
(Task t : tasks) {
(() -> process(t)).start();
}
