【发布时间】:2019-02-21 13:32:17
【问题描述】:
我目前正在使用 CompletableFuture supplyAsync() 方法将一些任务提交到公共线程池。这是代码 sn-p 的样子:
final List<CompletableFuture<List<Test>>> completableFutures = resolvers.stream()
.map(resolver -> supplyAsync(() -> task.doWork()))
.collect(toList());
CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()])).join();
final List<Test> tests = new ArrayList<>();
completableFutures.stream()
.map(completableFuture -> completableFuture.getNow())
.forEach(tests::addAll);
我想知道下面的代码与上面的代码有何不同。我从下面的代码中删除了父 completableFuture,并为每个 completableFuture 添加了 join() 而不是 getNow():
final List<CompletableFuture<List<Test>>> completableFutures = resolvers.stream()
.map(resolver -> supplyAsync(() -> task.doWork()))
.collect(toList());
final List<Test> tests = new ArrayList<>();
completableFutures.stream()
.map(completableFuture -> completableFuture.join())
.forEach(tests::addAll);
我在 spring 服务中使用它,存在线程池耗尽的问题。任何指针都非常感谢。
【问题讨论】:
-
为什么在第二个例子中使用
join?你可以做List<Test> tests = futures.stream().map(CompletableFuture::get).collect(toList())。 -
@daniu 相反,你不能这样做,因为
get被声明为抛出一个检查异常。 -
据我了解 get vs join 是关于它抛出的异常。检查与未检查。我不确定使用加入是否存在任何其他问题。谢谢指点
-
myThreadFactory.getExecutorService() - 它需要一个现有的线程池还是创建新的?如果创建,则说明线程池耗尽。
-
两种变体在线程耗尽方面是等效的。原因可能在 task.doWork() 的代码中 - 如果它运行缓慢并且任务太多。只需使用固定线程池即可。
标签: java spring multithreading threadpool completable-future