如何为CompletableFuture选择执行器::supplyAsync

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

我如何为CompletableFuture::supplyAsync选择执行器以避免污染.ForkJoinPool.commonPool()

(, 等) 中有很多选项ExecutorsnewCachedThreadPoolnewWorkStealingPoolnewFixedThreadPool

我在这里读到了关于新的ForkJoinPool的信息

如何为我的用例选择合适的一个?


答案 1

您应该使用方法。作为执行程序,您可以使用 Executors.new.. 中的任何一个。- 这取决于您的需求。最好使用 newFixedThreadPool() 而不是 newCachedThreadPool(),因为 newCachedThreadPool() 会导致许多线程出现性能问题,甚至抛出 OutOfMemoryError。这是一篇非常好的文章,有很好的例子。public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)


答案 2

除了Anton的答案之外,明智的做法是使用newFixedThreadPool而不是newCachedThreadPool,除非你知道该操作不会导致OutOfMemoryError。由于您的请求是一个i / o进程,因此使用异步nio请求,例如异步文件通道或异步静止客户端...等可以大大补充你的表现。


推荐