2016-06-25 66 views
1

我讀這篇文章http://danielwestheide.com/blog/2013/01/16/the-neophytes-guide-to-scala-part-9-promises-and-futures-in-practice.html,我一直在尋找這個代碼:未來的宣言似乎獨立於承諾

object Government { 
    def redeemCampaignPledge(): Future[TaxCut] = { 
    val p = Promise[TaxCut]() 
    Future { 
     println("Starting the new legislative period.") 
     Thread.sleep(2000) 
     p.success(TaxCut(20)) 
     println("We reduced the taxes! You must reelect us!!!!1111") 
    } 
    p.future 
    } 
} 

我見過這種類型的代碼幾次,我很困惑。因此,我們有這個Promise

val p = Promise[TaxCut]() 

Future

Future { 
    println("Starting the new legislative period.") 
    Thread.sleep(2000) 
    p.success(TaxCut(20)) 
    println("We reduced the taxes! You must reelect us!!!!1111") 
} 

我沒有看到他們之間的任何任務,所以我不明白:他們是如何連接?

回答

3

我沒有看到它們之間的任何轉讓,所以我不明白:他們如何連接 ?

A Promise是一種創建Future的方法。

當您使用Future { }和導入scala.concurrent.ExecutionContext.Implicits.global時,您在Scala的線程池線程之一上排隊函數。但是,這不是生成Future的唯一方法。 A Future不一定需要安排在不同的線程上。

什麼這個例子,就是:

  1. 創建Promise[TaxCut]將在不久的將來完成。
  2. 通過Future應用隊列函數在線程池線程內部運行。此功能還通過Promise.success方法完成Promise
  3. 返回通過Promise.future承諾產生的未來。當這個未來回報時,它可能還沒有完成,這取決於排隊到Future的函數的執行速度真的如何快(OP正試圖通過Thread.sleep方法傳達此信息,延遲未來完成)。
+1

'Future {}'不是一個宏。它只是伴侶對象中的應用方法。 –

+0

@Łukasz非常感謝,因爲某種原因,這是一個宏觀印象。 –