Как выбрать исполнителя для 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... и т.д., Может значительно повысить вашу производительность.