Я хочу создать 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);
}
}
}
}
Если я добавлю соединение< /code> вызов тестовой задачи, код в WhenCompleteAsync начинает выполняться, но это «решение» в конечном итоге (естественно) приводит к тому, что весь раздел становится однопоточным.
Я неправильно понимаю, как работает WhenCompleteAsync? Как мне добиться того, чего я хочу?
Спасибо,
Подробнее здесь: https://stackoverflow.com/questions/788 ... torservice