在Java应用程序中实现并发性的正确方法是什么?我知道线程之类的东西,当然,我已经为Java编程10年了,但是还没有太多的并发经验。
例如,我必须异步加载一些资源,而且只有在加载完之后,我才能继续并完成更多的工作。不用说,他们将如何结束是没有秩序的。我该怎么做?
在JavaScript中,我喜欢使用jQuery.deferred基础设施
$.when(deferred1,deferred2,deferred3...)
.done(
function(){//here everything is done
...
});但是我用Java做什么呢?
发布于 2016-04-15 11:05:16
如果我没有使用并行流或Spring的TaskExecutor,我通常使用CountDownLatch。使用任务#实例化,对完成其任务的每个线程减少一次。CountDownLatch.await()一直等到锁存器为0。真的很有用。
在这里阅读更多信息:JavaDocs
发布于 2016-04-15 11:26:10
你可以通过多种方式来实现它。
1.ExecutorService invokeAll() API
执行给定的任务,返回持有其状态和结果的期货列表。
一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。
CountDownLatch是用给定的计数初始化的。等待方法阻塞,直到由于调用countDown()方法而使当前计数达到零为止,在此之后,所有等待线程都将被释放,并且等待返回的任何后续调用都将立即释放。这是一个一次性现象--计数不能重置。如果需要重置计数的版本,请考虑使用CyclicBarrier。
3.ForkJoinPool或newWorkStealingPool() in 遗嘱执行人是另一种方式。
请看一下与SE相关的问题:
发布于 2016-04-15 11:04:21
我会使用并行流。
Stream.of(runnable1, runnable2, runnable3).parallel().forEach(r -> r.run());
// do something after all these are done.如果您需要这是异步的,那么您可以使用池或线程。
我必须异步加载一些资源,
你可以像这样收集这些资源。
List<String> urls = ....
Map<String, String> map = urls.parallelStream()
.collect(Collectors.toMap(u -> u, u -> download(u)));一旦同时下载了所有资源,这将为您提供一个映射。默认情况下,并发性将是您拥有的CPU数量。
https://stackoverflow.com/questions/36645364
复制相似问题