CompletableFuture.runAsyn c против массива CompletableFuture - PullRequest
0 голосов
/ 17 февраля 2020

Я нашел этот код в проекте:

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();

Какая разница с этим?

ExecutorService threadPool = Executors.newFixedThreadPool(threadCount);
CompletableFuture.runAsync(() -> { process.run(queue); }, threadPool );

Спасибо за ваше объяснение.

1 Ответ

0 голосов
/ 19 февраля 2020
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, который используется по умолчанию для завершаемых фьючерсов, а затем в указанном пуле потоков)
  • В первом случае вы ожидаете завершения набора задач, во втором - просто асинхронно запускаете задачу
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...