int threadCount = 10;
CompletableFuture<?>[] futures = new CompletableFuture<?>[threadCount];
for (int i = 0; i < threadCount; i++) {
futures[i] = CompletableFuture.runAsync(() -> { process.run(queue); });
}
// Wait all futures
CompletableFuture.allOf(futures).join();
В этом случае вы создаете множество завершаемых фьючерсов, которые являются результатом выполнения асинхронного кода в общем пуле ForkJoin. Затем процесс ожидает завершения всех фьючерсов.
ExecutorService threadPool = Executors.newFixedThreadPool(threadCount);
CompletableFuture.runAsync(() -> { process.run(queue); }, threadPool );
В этом случае вы выполняете код в указанном пуле потоков.
Различия между этими блоками кода
- Они выполняются в разных пулах потоков (сначала в общем ForkJoin, который используется по умолчанию для завершаемых фьючерсов, а затем в указанном пуле потоков)
- В первом случае вы ожидаете завершения набора задач, во втором - просто асинхронно запускаете задачу