2012-01-11 3 views
3

scala 및 scalaz의 초보자로서 약속을 사용할 때 문제가 발생했습니다. 내 코드는 이렇게.scalaz의 약속을 사용할 때 호출 함수

import scalaz._ 
import Scalaz._ 

object Main2 extends Application { 
    def sleeper() = { 
    Thread.sleep(2000) 
    } 
    val message = promise { 
    println("begin") 
    sleeper 
    println("ok") 
    "ok" 
    } 
    Thread.sleep(5000) 
    println("try to get") 
    println(message()) 
} 

다음 출력은 이상하게 보입니다. 슬리퍼 메서드가 호출되지 않았고 스레드가 차단 된 것 같습니다. - 내가 인라인 잠을 호출 침목을 교체하는 경우

begin 
try to get 

는하지만, 그것을 잘 보인다 - 여기

object Main2 extends Application { 
    def sleeper() = { 
    Thread.sleep(2000) 
    } 
    val message = promise { 
    println("begin") 
    Thread.sleep(2000) 
    println("ok") 
    "ok" 
    } 
    Thread.sleep(5000) 
    println("try to get") 
    println(message()) 
} 

출력 -

begin 
ok 
try to get 
ok 

나는 왜 이해가 안 할 수는 전문가는 조언을 해주시겠습니까?

답변

8

완전한 설명을 드릴 수는 없지만,이 문제는 Application 특성과 관련된 일부 문제와 관련이있는 것으로 보입니다.

간단히 말해서 : Application의 생성자 본문이 너무 일찍 및 정적 초기화 컨텍스트에서 실행됩니다. 이 시점에서 스레드를 아주 잘 처리하지 못합니다 (전혀 아닐 경우). current Apidoc 메시지의 의미 :

정적 초기화가 완료 될 때까지 객체를 참조하는 스레드 코드가 차단됩니다. 그러나 응용 프로그램을 확장하는 개체의 전체 실행은 정적 초기화 중에 발생하기 때문에 포함 된 개체와 동기화해야하는 경우 동시 코드는 항상 교착 상태가됩니다.

Scala 2.9에서 시작, 그래서 당신이 할 필요가 object Main2 extends App를 작성하고 작동해야하고, 이러한 문제의 대부분을 해결하는 새로운 App 특성이있다.

관련 문제