2014-06-18 7 views
2

나는이 작동하지 않는 이유를 파악 붙어 :이해를위한이 간단한 스칼라가 미래를 실행하지 않는 이유는 무엇입니까?

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