CompletableFuture::supplyAsync(() -> IO bound queries)
如何为CompletableFuture :: supplyAsync选择Executor以避免污染ForkJoinPool.commonPool()
。
Executors
中有很多选项(newCachedThreadPool
,newWorkStealingPool
,newFixedThreadPool
等)
我读到了新的ForkJoinPool here
如何为我的用例选择正确的?
答案 0 :(得分:4)
您应该使用public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)
方法。
作为执行者,您可以使用Executors.new中的任何一个.. - 这取决于您的需求。
最好使用newFixedThreadPool()而不是newCachedThreadPool(),因为newCachedThreadPool()可能导致创建到许多线程的性能问题,甚至抛出OutOfMemoryError。
这是一个非常好的article,有很好的例子。
答案 1 :(得分:0)
添加到Anton的答案中,使用newFixedThreadPool而不是newCachedThreadPool是明智的,除非您知道该操作不会导致OutOfMemoryError。由于您的请求是一个I / O进程,因此使用Async nio请求(如AsynchronousFileChannel或Async Rest Client等)可以极大地补充您的性能。