我使用以下两个代码片段在多个线程中执行代码。但我的行为却有所不同。
摘录1:
val futures = Future.sequence(Seq(f1, f2, f3, f4, f5))
futures.onComplete{
case Success(value) =>
case Failure(value) =>
}
摘录2:
Await.result(Future.sequence(Seq(f1, f2, f3, f4, f5)), Duration(500, TimeUnit.SECONDS))
在期货中,我只是设置一些属性并检索结果。
注意:只知道上述两个片段之间的行为差异就足够了。
答案 0 :(得分:2)
onComplete
在ExecutionContext
中的某个任意(未指定)线程上运行,而Await.result
在当前线程上运行,并阻塞它直到它完成或指定的超时为超过。第一个是非阻塞,第二个是阻塞。
在两个片段中处理失败的方式也存在差异,但从查看代码时可以看出这一点。
答案 1 :(得分:0)
实际上future.onComplete
注册了一个回叫并等待未来完成控制后的结果,并且看看未来的内容,可能是成功还是失败。
另一方面,Await阻止运行未来的线程,直到将来完成特定超时。
因此,onComplete是非阻塞的,Await本质上是阻塞的。
如果你想使用await,那么尝试收集尽可能多的未来你可以等待一旦你不应该为你拥有的每一个未来使用Await在代码中它会减慢你的代码。