Можно использовать ForkJoinPool с асинхронным. Этот подход - не совсем то, для чего был разработан ForkJoinPool, - который решает задачу «Разделяй и властвуй» и использует алгоритм перехвата работы, но для выполнения задач в стиле событий или блокирования ввода-вывода, и это допустимый вариант использования.
Итак, при базовом использовании вы можете сделать:
CompletableFuture.runAsync(() -> doSomething(), ForkJoinPool.commonPool());
Вы также можете создать пользовательский ForkJoinPool в асинхронном режиме. Рабочие в ForkJoinPool в асинхронном режиме обрабатывают задачи в порядке FIFO (первым пришел, первым вышел). По умолчанию ForkJoinPools обрабатывает такие задачи в порядке LIFO (последний пришел, первый вышел). Также настройка асинхронного режима касается только разветвленных задач, которые никогда не объединяются. Может использоваться для задач в стиле событий, которые отправляются, но никогда не присоединяются (задачи, которые выполняются по своим побочным эффектам, а не для возврата результата, который будет обработан задачей разветвления, а затем присоединения).
Вы можете создать собственный ForkJoinPool с заданным параллелизмом в асинхронном режиме, например так (первый параметр - это размер пула, последний - bool asyncMode):
ForkJoinPool pool = new ForkJoinPool(
6, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
Итак, что вы ищете:
@Bean("threadPoolTaskExecutor")
public Executor getAsyncExecutor() {
ForkJoinPool pool = new ForkJoinPool(
6, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
return pool;
}