首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中等待多个任务的完成?

如何在Java中等待多个任务的完成?
EN

Stack Overflow用户
提问于 2016-04-15 11:00:24
回答 8查看 13.2K关注 0票数 10

在Java应用程序中实现并发性的正确方法是什么?我知道线程之类的东西,当然,我已经为Java编程10年了,但是还没有太多的并发经验。

例如,我必须异步加载一些资源,而且只有在加载完之后,我才能继续并完成更多的工作。不用说,他们将如何结束是没有秩序的。我该怎么做?

在JavaScript中,我喜欢使用jQuery.deferred基础设施

代码语言:javascript
复制
$.when(deferred1,deferred2,deferred3...)
 .done(
   function(){//here everything is done
    ...
   });

但是我用Java做什么呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-04-15 11:05:16

如果我没有使用并行流或Spring的TaskExecutor,我通常使用CountDownLatch。使用任务#实例化,对完成其任务的每个线程减少一次。CountDownLatch.await()一直等到锁存器为0。真的很有用。

在这里阅读更多信息:JavaDocs

票数 4
EN

Stack Overflow用户

发布于 2016-04-15 11:26:10

你可以通过多种方式来实现它。

1.ExecutorService invokeAll() API

执行给定的任务,返回持有其状态和结果的期货列表。

2.CountDownLatch

一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。 CountDownLatch是用给定的计数初始化的。等待方法阻塞,直到由于调用countDown()方法而使当前计数达到零为止,在此之后,所有等待线程都将被释放,并且等待返回的任何后续调用都将立即释放。这是一个一次性现象--计数不能重置。如果需要重置计数的版本,请考虑使用CyclicBarrier。

3.ForkJoinPoolnewWorkStealingPool() in 遗嘱执行人是另一种方式。

请看一下与SE相关的问题:

如何等待产生自己线程的线程?

执行器:如果任务是递归创建的,如何同步等待直到所有任务完成?

票数 8
EN

Stack Overflow用户

发布于 2016-04-15 11:04:21

我会使用并行流。

代码语言:javascript
复制
Stream.of(runnable1, runnable2, runnable3).parallel().forEach(r -> r.run());
// do something after all these are done.

如果您需要这是异步的,那么您可以使用池或线程。

我必须异步加载一些资源,

你可以像这样收集这些资源。

代码语言:javascript
复制
List<String> urls = ....

Map<String, String> map = urls.parallelStream()
                              .collect(Collectors.toMap(u -> u, u -> download(u)));

一旦同时下载了所有资源,这将为您提供一个映射。默认情况下,并发性将是您拥有的CPU数量。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36645364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档