1. 程式人生 > >scala的Promise和Future的理解

scala的Promise和Future的理解

and 處理 read cit 未來 current Language 原因 ase

scala版本:2.11
在scala的並發包下存在2個類Promise和Future。用起來很簡單。例子如下:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Future, Promise}

object PromiseAndFuture extends App {

  // 小李:等你到上海了,打電話告訴我
  val tellMe = Promise[String]()

  val result = tellMe.future
  result.recover {
    case CannotArriveException(msg) => msg
  }.foreach(msg => {
    println(s"接電話:$msg")
    println("小李:好,立刻去接他。")// 小李自己的任務
  })

  xiaoZhangTask()

  println("小李:逛街中。。。")
  Thread.sleep(5000) // 防止線程直接退出

  private def xiaoZhangTask() = {
    Future {
      println("小張:從北京出發了。")
      Thread.sleep(2000) // 一直在路上
      println("小張:已經到上海了,該告訴小李了。")
      tellMe.success("我是小張,我已經到上海了。")
    }.recover {
      case _: Throwable =>
        println("小張:我迷路了,該告訴小李了。")
        tellMe.failure(CannotArriveException("我是小張,我找不到上海怎麽辦?"))
    }
  }
}

case class CannotArriveException(msg: String) extends Exception(msg)

控制臺輸入如下:

小張:從北京出發了。
小李:逛街中。。。
小張:已經到上海了,該告訴小李了。
接電話:我是小張,我已經到上海了。
小李:好,終於可以見到他了。
  • Promise字面意思為“許可”,當你向讓另外一個人(另外一個線程)去做某件事,並且需要該事情的結果,你需要先“許可”對方可以告訴你的結果(成功/失敗,成功是什麽或者失敗的原因是什麽)。
  • Future字面意思為“未來”,表示未來發生的結果,這個結果可關心可不關心。如果關心可使用maponCompleterecover等方法來處理。

結論:在異步轉同步時Promise非常好用。其他情況再具體分析是否要用Promise,大部分情況直接使用Future就比較簡單。

scala的Promise和Future的理解