Man*_*duc 3 scala intermittent future sequence
我写了这个方法:
import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.util.{ Success, Failure }
object FuturesSequence extends App {
val f1 = future {
1
}
val f2 = future {
2
}
val lf = List(f1, f2)
val seq = Future.sequence(lf)
seq.onSuccess {
case l => println(l)
}
}
Run Code Online (Sandbox Code Playgroud)
我期待 Future.sequence 将 List[Future] 收集到 Future[List] 中,然后等待每个期货(在我的情况下为 f1 和 f2)完成,然后在我的情况下对 Future[List] seq 调用 onSuccess。
但是在多次运行此代码后,它只会偶尔打印一次“List(1, 2)”,我无法弄清楚为什么它没有按预期工作。
试试这个,
import scala.concurrent._
import java.util.concurrent.Executors
import scala.util.{ Success, Failure }
object FuturesSequence extends App {
implicit val exec = ExecutionContext.fromExecutor(Executors.newCachedThreadPool)
val f1 = future {
1
}
val f2 = future {
2
}
val lf = List(f1, f2)
val seq = Future.sequence(lf)
seq.onSuccess {
case l => println(l)
}
}
Run Code Online (Sandbox Code Playgroud)
这将始终打印List(1,2). 原因很简单,exec上面是线程(不是守护线程)的 ExecutionContext ,在您的示例中, ExecutionContext 是默认的,ExecutionContext.Implicits.global其中包含守护线程。
因此,作为守护进程,进程不会等待seq未来完成并终止。如果seq确实完成了,那么它会打印出来。但这并不总是发生
| 归档时间: |
|
| 查看次数: |
2225 次 |
| 最近记录: |