2016-06-25 1 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, вы ставите очередь на одну из потоков Threadpool в Scala. Но это не единственный способ создать Future. A Future необязательно должен быть запланирован на другой поток.

Что этот пример:

  1. Создает Promise[TaxCut] который будет завершен в ближайшем будущем.
  2. Очереди применяются для выполнения функции внутри потока threadpool через Future. Эта функция также завершает Promise по методу Promise.success.
  3. Возвращает будущее, генерируемое обещаниями через Promise.future. Когда это будущее вернется, оно еще не завершено, в зависимости от того, насколько быстро выполняется выполнение функции, стоящей в очереди на Future (ОП пытался передать это методом Thread.sleep, задерживая завершение будущего).
+1

'Future {}' не является макросом. Это просто применить метод в сопутствующем объекте. –

+0

@ Łukasz Спасибо за это, было под впечатлением, что это был макрос по какой-то причине. –

 Смежные вопросы

  • Нет связанных вопросов^_^