【发布时间】:2016-03-26 13:03:55
【问题描述】:
考虑以下代码:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._
object FutureFor {
def getA(n: Int) = {
val x: Future[String] = Future {
println("I'm getA")
for (i <- 1 to 5) {
println(".")
Thread.sleep(200)
}
s"A$n"
}
x
}
def getB(n: Int) = {
val x: Future[String] = Future {
println("I'm getB")
for (i <- 1 to 5) {
println(".")
Thread.sleep(200)
}
s"B$n"
}
x
}
def main(args: Array[String]) = {
println("\nThis is sequential")
val rs1 = for {
a <- getA(1)
b <- getB(1)
} yield (a + b)
println(Await.result(rs1, 1 minute))
println("\nThis is concurrent")
val first = getA(2)
val second = getB(2)
val rs2 = for {
a <- first
b <- second
} yield (a + b)
println(Await.result(rs2, 1 minute))
}
}
这段代码的输出是:
This is sequential
I'm getA
.
.
.
.
.
I'm getB
.
.
.
.
.
A1B1
This is concurrent
I'm getB
.
I'm getA
.
.
.
.
.
.
.
.
.
A2B2
但是,我认为在这两种情况下,Future 都应该同时执行。在第一种情况下执行顺序的原因是什么?
【问题讨论】:
-
这两种情况都是如此,所以为什么它不会阻止第二种情况。而且,
Thread.sleep在Future之内,所以任何其他Future都不应该等待这个完成。这是我不明白的。
标签: scala concurrency future