【问题标题】:How to chose an Executor for CompletableFuture::supplyAsync如何为 CompletableFuture::supplyAsync 选择 Executor
【发布时间】:2016-01-27 09:46:51
【问题描述】:

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

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

Executors 中有很多选项(newCachedThreadPoolnewWorkStealingPoolnewFixedThreadPool 等)

我读到了新的 ForkJoinPool here

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

【问题讨论】:

  • 如果并发查询的数量将受到限制,您可以使用缓存线程池 - 如果数量可能非常高(几个 100 或 1000 或更多),您可以使用具有合理限制的固定线程池。答案取决于您的用例和参数(内存、操作系统等)。
  • 这是我读过的关于 Executors 的最佳文章,来自 Jessica Kerr:blog.jessitron.com/2014/01/choosing-executorservice.html - 你应该阅读它。
  • 只使用默认的(普通FJP)。如果您对这种方法有疑问,请提出新问题,具体说明您遇到的确切问题。如果你没有问题,那很好。
  • 还有一点需要考虑的是不能关闭公共池。因此,如果您可能需要,您应该使用自己的Executor

标签: java java-8 executorservice threadpoolexecutor completable-future


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      相关资源
      最近更新 更多