CompletableFuture::supplyAsync(() -> IO bound queries)
如何为 CompletableFuture::supplyAsync 选择 Executor 以避免污染ForkJoinPool.commonPool()
.
Executors
( newCachedThreadPool
, newWorkStealingPool
,newFixedThreadPool
等)中有很多选项
如何为我的用例选择合适的?
CompletableFuture::supplyAsync(() -> IO bound queries)
如何为 CompletableFuture::supplyAsync 选择 Executor 以避免污染ForkJoinPool.commonPool()
.
Executors
( newCachedThreadPool
, newWorkStealingPool
,newFixedThreadPool
等)中有很多选项
如何为我的用例选择合适的?
你应该使用public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)
方法。作为执行者,您可以使用 Executors.new.. 中的任何一个 - 这取决于您的需要。最好使用 newFixedThreadPool() 而不是 newCachedThreadPool(),因为 newCachedThreadPool() 会导致创建许多线程的性能问题,甚至抛出 OutOfMemoryError。这是一篇很好的文章,里面有很好的例子。
添加到 Anton 的答案中,明智的做法是使用 newFixedThreadPool 而不是 newCachedThreadPool,除非您知道该操作不会导致 OutOfMemoryError。由于您的请求是一个 i/o 进程,因此使用 Async nio 请求(例如 AsynchronousFileChannel 或 Async Rest Client...等)可以极大地提高您的性能。