Фреймворк Executor управляет пулами потоков, поэтому вы отправляете задачи вместо ручного создания потоков, а CompletableFuture композирует асинхронные операции декларативно. Вместе они — современный способ выполнения конкурентной/асинхронной работы в Java — избегая стоимости и сложности управления сырыми потоками.
Проблема с сырыми потоками
(Task t : tasks) {
(() -> process(t)).start();
}
