Scala异步编程中Future的两种等待方式
Await 同步等待
在我的上一篇博客中提到的 Await 是一种同步等待机制,主线程会在有限的时间内等待某个 Future 进行。
Await主要有两个方法。第一个方法是调用 result方法令主线程进入阻塞等待,直到获取你需要的 Future的值。
package Option.test
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
object Await {
val intFuture = Future {
println("正在计算...")
println("执行此计算任务的线程是:" + Thread.currentThread().getName)
Thread.sleep(1000)
30
}
//主程序会在 3 秒内等待该结果,并赋值。
val int: Int = Await.result(intFuture, 3 second)
println(int)
}
一般用于需要获取到该 future 的返回值才能做进一步操作的情况,如果只关心该 future 的完成状态,可以调用 ready 方法。当 future 仍处于工作状态时,主线程会等待至多 3 秒。
Await.ready(intFuture, 3 second)
onComplete异步等待
Scala提供注册“回调函数”的方式来令你通过函数副作用获取到某个 future 在未来返回的值。
package Option.test
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scala.util.Success
object Await11 {
def main(args: Array[String]): Unit = {
val intFuture = Future {
println("正在计算...")
println("执行此计算任务的线程是:" + Thread.currentThread().getName)
Thread.sleep(1000)
30
}
// Await.ready(intFuture, 3 second)
// 和刚才的情况不同,如果主线程不阻塞一会,那么这个程序会提前结束推出。
Thread.sleep(3000)
var intValue: Int = 0
intFuture onComplete {
case Success(value) =>
println(value)
// 通过代码块副作用获取到这个 Future 的 value 返回值。
intValue = value
case _ => println("出现了意外的错误")
}
}
}
这种方式不会阻塞主线程,为了能看到程序运行结果,我们需要主动调用 Thread.sleep 让主线程休眠一会,否则程序会立刻结束。onComplete 的返回值是一个 Unit 数据类型。