14

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

如何为 CompletableFuture::supplyAsync 选择 Executor 以避免污染ForkJoinPool.commonPool().

Executors( newCachedThreadPool, newWorkStealingPool,newFixedThreadPool等)中有很多选项

在这里读到了新的 ForkJoinPool

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

4

2 回答 2

6

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

于 2016-04-22T15:17:00.693 回答
0

添加到 Anton 的答案中,明智的做法是使用 newFixedThreadPool 而不是 newCachedThreadPool,除非您知道该操作不会导致 OutOfMemoryError。由于您的请求是一个 i/o 进程,因此使用 Async nio 请求(例如 AsynchronousFileChannel 或 Async Rest Client...等)可以极大地提高您的性能。

于 2016-06-13T23:28:28.490 回答