Scala中wait.result和futures.onComplete之间的差异

Scala中wait.result和futures.onComplete之间的差异,scala,future,Scala,Future,我使用以下两个代码片段在多个线程中执行代码。但我有不同的行为 片段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, TimeUn

我使用以下两个代码片段在多个线程中执行代码。但我有不同的行为

片段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))
在未来,我只是设置一些属性并检索结果


注意:只知道以上两个代码片段之间的行为差异就足够了。

onComplete
ExecutionContext
中的某个任意(未指定)线程上运行,而
等待。result
在当前线程上运行,并阻止它,直到它完成或超过指定的超时。第一个是非阻塞,第二个是阻塞


这两个代码片段中的失败处理方式也有差异,但从代码来看这是显而易见的。

实际上是
future。onComplete
注册一个回调,并在future完成后等待结果控制进入future,看看future里面有什么,可能是成功,也可能是失败

另一方面,wait阻塞运行future的线程,直到future在特定的超时时间内完成

因此,onComplete在本质上是非阻塞的,而wait是阻塞的


如果你想使用wait,那么试着收集尽可能多的future,然后做wait一次,你不应该为代码中的每个future都使用wait,这会降低代码的速度

什么是当前线程。它是指操作系统的单线程吗?而且阻塞意味着其他线程将在当前线程之后执行?不,没有“操作系统的单线程”这样的东西,除非你使用的是一个奇怪的嵌入式操作系统。当前线程表示调用
wait.result
方法的线程。阻塞意味着下一个语句/表达式只有在线程解除阻塞后才会计算;非阻塞意味着“下一个”(不是真正的下一个)语句/表达式将在另一个线程上求值,因此它不会阻塞当前线程。只是强制性的建议:您不应该在生产代码中使用wait。仅用于测试鼠海豚。