溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

scala的Promise和Future的理解

發(fā)布時(shí)間:2020-06-22 10:24:38 來源:網(wǎng)絡(luò) 閱讀:1388 作者:53422245 欄目:開發(fā)技術(shù)

scala版本:2.11
在scala的并發(fā)包下存在2個(gè)類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("小李:好,立刻去接他。")// 小李自己的任務(wù)
  })

  xiaoZhangTask()

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

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

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

控制臺輸入如下:

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

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI