【发布时间】:2016-05-11 14:11:28
【问题描述】:
我不明白为什么这个取自 here 的示例会阻塞
import java.util.concurrent.Executors
import scala.concurrent._
import scala.concurrent.duration.Duration
object Main {
def main(args: Array[String]) {
println("Start")
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(1))
println("Made ec")
def addOne(x: Int) = {
println("Executing addOne")
Future(x)
}
def multiply(x: Int, y: Int): Future[Int] = Future {
val a = addOne(x)
val b = addOne(y)
val result: Future[Int] = for (r1 <- a; r2 <- b) yield r1 * r2
println("Got result")
val awaitedResult: Int = Await.result(result, Duration.Inf)
println("awaitedResult = " + awaitedResult)
awaitedResult
}
val mult: Future[Int] = multiply(2,2)
val multResult: Int = Await.result(mult, Duration.Inf)
println("Result of mult = " + multResult)
}
}
IntelliJ Scala 项目的输出:
Connected to the target VM, address: '127.0.0.1:36346', transport: 'socket'
Start
Made ec
Executing addOne
Executing addOne
Got result
awaitedResult = 4
Result of mult = 4
Disconnected from the target VM, address: '127.0.0.1:36346', transport: 'socket'
Process finished with exit code 130
注意:
Hot Swap failed Main: hierarchy change not implemented;
Main: Operation not supported by VM
奇怪的是,在 IntelliJ 控制台中,我看到了答案,4,但我必须单击红色的“停止”按钮,因为它不会终止。
【问题讨论】:
-
为什么会阻塞?因为每次调用
Await.result时都会阻塞,这正是这个方法的作用,它阻塞直到Future结束。
标签: scala intellij-idea future blocking