Scala 的 for 表达式功能要比 Java 强大得多,包括用于组合 Future 计算事件。
基于上述的异步运算 future1 和 future2 ,我们创建第三个运算 future3,对刚才的两个运算结果进行加和。代码清单如下:
下面展示一些 内联代码片
。
// An highlighted block
package Option.test
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Await, Future}
import scala.concurrent.duration.Duration
object futrue {
def main(args: Array[String]): Unit = {
//观察开始时间
println(new java.util.Date())
//把future看成开启一个新线程
val future1: Future[Int] = Future {
// 在这个计划中,执行它的线程会首先休眠 3 秒,然后返回一个 Int 值。
Thread.sleep(3000)
println("执行 future1")
4
}
val future2: Future[Int] = Future {
Thread.sleep(2000)
println("执行 future2")
5
}
//要用到1和2的数据所以要等待一下
val future3: Future[Int] = for {
x <- future1
y <- future2
} yield {
x + y
}
//我们这里使用了 Await 等待结果调用完毕,不限制等待时间。
println(Await.result(future3, Duration.Inf))
//观察结束时间
println(new java.util.Date())
}
}
从主程序完成到完成计算,总共花费了 3 秒的时间(而不是 5 秒),因为上述的代码都是在异步的环境中执行完成的。
我们可以画出一个简单的 PETRI 图出来,并求出这个图的最短完成时间(详情参考离散数学科目:关键路径的相关知识)。
注意,如果使用 for 表达式对 Future 做变换,一定要将 Future 声明在 for 循环的前面,否则 for 表达式将在串行的环境下完成它们。
结果图示:刚好三秒