Выполнять разные этапы CompletableFuture на разных ExecutorService.JAVA

Программисты JAVA общаются здесь
Anonymous
Выполнять разные этапы CompletableFuture на разных ExecutorService.

Сообщение Anonymous »

Чего я пытаюсь достичь:
Я хочу создать CompletableFuture, который работает в ExecutorService, а затем добавить к нему этап, который выполняется в другом ExecutorService.
Что я пробовал:

Код: Выделить всё

try (ExecutorService benchRunner = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() - 1);
ExecutorService resultHandler = Executors.newVirtualThreadPerTaskExecutor()) {
for (Algorithm algorithm : Algorithm.values()) {
for (Distribution distribution : Distribution.values()) {
for (Integer arraySize : List.of(30, 60, 90, 300, 600, 900, 3000, 6000, 9000)) {
SortingBenchmark.Config config = new SortingBenchmark.Config(arraySize, algorithm, distribution);

CompletableFuture benchmarkTask = new CompletableFuture();
benchmarkTask.completeAsync(new SortingBenchmark(config), benchRunner);
benchmarkTask.whenCompleteAsync((b, t) -> {
if (t != null) {
System.err.println("Failed on: " + config);
return;
}

System.out.println("Finished: " + config);
}, resultHandler);
}
}
}
}
Насколько я понимаю, WhenCompleteAsync должен выполняться на resultHandler после того, как новый SortingBenchmark(config) выполняется на BenchRunner. Однако когда я запускаю это, код в разделе WhenCompleteAsync никогда не запускается; однако раздел CompleteAsync работает нормально (я могу это сказать, потому что 7 моих ядер закреплены на 100% использовании, и я вижу вывод stdout).
Если я добавлю соединение< /code> вызов тестовой задачи, код в WhenCompleteAsync начинает выполняться, но это «решение» в конечном итоге (естественно) приводит к тому, что весь раздел становится однопоточным.
Я неправильно понимаю, как работает WhenCompleteAsync? Как мне добиться того, чего я хочу?
Спасибо,

Подробнее здесь: https://stackoverflow.com/questions/788 ... torservice

Вернуться в «JAVA»