2014-06-18 63 views
2

我堅持弄清楚爲什麼這不起作用:爲什麼這個簡單的Scala理解不會執行期貨?

import scala.concurrent.future 
import scala.concurrent.Future 
import scala.concurrent.ExecutionContext 

import scala.concurrent.ExecutionContext.Implicits.global 

object FutureTest { 

    def main(args: Array[String]) { 
    val result1 = future("a") 
    val result2 = future("b") 
    val result3 = future("c") 

    val res = for { 
     r1 <- result1 
     r2 <- result2 
     r3 <- result3 
    } yield (r1 + r2 + r3) 

    for { r <- res} yield(println(r)) 
    } 
} 

我期待這個打印「ABC」,但沒有真正發生。

+0

打印「ABC」在我的情況.. – Christian

+2

我解決了這個問題,添加了一個Await.result(res,3分鐘),其中res是一個從for分配的val。 – sscarduzio

回答

7

您正在執行一個獨立的程序,問題是,主線程終止以後才能完成,看到的東西,你可以這樣做:

import scala.concurrent.future 
import scala.concurrent.Future 
import scala.concurrent.ExecutionContext 

import scala.concurrent.ExecutionContext.Implicits.global 

object FutureTest { 

    def main(args: Array[String]) { 
    val result1 = future("a") 
    val result2 = future("b") 
    val result3 = future("c") 

    val res = for { 
     r1 <- result1 
     r2 <- result2 
     r3 <- result3 
    } yield (r1 + r2 + r3) 

    val printing = for { r <- res} yield(println(r)) 

    Await.ready(printing, Duration.Inf) 
    } 
} 
+0

不知何故,我預計程序會自動等待期貨終止。顯然這不會發生。我在找到答案之前找到了類似的解決方案(請參閱第二個問題評論)。但是,我同意這是解決方案。 – sscarduzio

+0

那麼,如果是這樣的話,那麼期貨可能就沒有用了,因爲主線程可能會無限期地等待未來的結果:D –

+0

我同意期貨在一般情況下應該是異步的,但至少主線程可以等待任何終止前未完成的未來。我猜! – sscarduzio

相關問題