Как выбрать исполнителя для CompletedFuture:: supplyAsync

CompletableFuture::supplyAsync(() -> IO bound queries)

Как выбрать исполнителя для CompletedFuture:: supplyAsync, чтобы избежать загрязнения ForkJoinPool.commonPool().

В Executors (newCachedThreadPool, newWorkStealingPool, newFixedThreadPool и т.д.) есть много опций

И я читал о новом ForkJoinPool здесь

Как выбрать правильный вариант для моего использования?

Ответ 1

Вы должны использовать метод public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor). В качестве исполнителя вы можете использовать любой из Executors.new.. - это зависит от ваших потребностей. Лучше использовать newFixedThreadPool(), а не newCachedThreadPool(), поскольку newCachedThreadPool() может привести к проблемам с производительностью, создавая множество потоков или даже выбросив OutOfMemoryError. Здесь очень хорошая статья с хорошими примерами.

Ответ 2

Добавление в Anton Ответ. Разумно использовать newFixedThreadPool, а не newCachedThreadPool, если вы не знаете, что операция не вызовет OutOfMemoryError. Поскольку ваш запрос является процессом ввода-вывода, использование запроса Async nio, такого как AsynchronousFileChannel или Async Rest Client... и т.д., Может значительно повысить вашу производительность.