CompletableFuture supplyAsync(供应商)vs supplyAsync(供应商,执行者)

时间:2018-03-23 02:00:15

标签: java multithreading completable-future

Java Docs说CompletableFuture:supplyAsync(Supplier<U> supplier)ForkJoinPool#commonPool()中运行任务,而CompletableFuture:suppleAsync(supplier, executor)在给定的执行程序中运行它。

我试图找出使用哪一个。所以我的问题是:

  1. 什么是ForkJoinPool#commonPool()
  2. 我应该何时使用supplyAsync(supplier) vs supplyAsync(supplier, executor)

1 个答案:

答案 0 :(得分:3)

ForkJoinPool#commonPool()是Java API提供的公共线程池。如果您曾使用stream API,那么并行操作也在此线程池中完成。

使用公共线程池的优点是Java API可以为您管理 - 从创建到销毁。缺点是你会期望很多类共享这个池的用法。

如果您使用了执行程序,那么它就像拥有一个私人池,因此在使用过程中没有任何事情可以与您抗争。您自己创建执行程序,并将其传递给CompletableFuture。但是,请注意,最终实际性能仍将取决于线程中的内容以及硬件。

通常,我发现使用公共线程池来执行更多计算密集型操作是很好的,而执行程序更适合做必须等待事情的事情(如IO)。当你在共同的线程池线程中“睡觉”时,就像在公共洗手间使用隔间在你的手机上玩游戏 - 其他人可能正在等待隔间。