我有以下测试代码片段:
import scala.concurrent.{Await, Future}
import scala.concurrent.duration.Duration
import scala.util.Success
import scala.concurrent.ExecutionContext.Implicits.global
object FutureAndThen extends App {
val future = Future {
println("Started initial Future")
10
} andThen { case Success(value) =>
println("Started callback")
Thread.sleep(5000)
println(s"Finished callback: value = $value")
} map { x =>
println("Chained transformation")
x * 2
}
println(Await.result(future, Duration.Inf))
}
它产生以下输出:
Started initial Future
Started callback
Finished callback: value = 10
Chained transformation
20
我希望andThen
回调异步执行。但实际的执行是下一个:
- 执行原来的未来
- 执行异步回调
- 运行转换 (
map
)
起初我认为问题在于ExecutionContext
决定在单线程中运行所有这些操作。我将其更改为使用 custom ExecutionContext
:
implicit val ctx = ExecutionContext.fromExecutor(
(command: Runnable) => new Thread(command).start()
)
结果是一样的。你能告诉我我错过了什么吗?