2013-03-10 1 views
5

두 개의 병렬 연산을 실행하고 두 번째 병렬 연산이 끝나면 첫 번째 병렬 연산을 중단해야합니다. Thread의 명시 적으로 사용하지 않고,스칼라에서 비동기 계산을 방해하는 방법은 무엇입니까?

/** 
* Runs <var>sup</var> in parallel with <var>main</var>. 
* Terminate (interrupt) it when <var>main</var> finishes. 
*/ 
def support[R](sup: => Unit, main: => R): R = { 
    val supThread = new Thread { 
    override def run = { sup }; 
    } 

    supThread.start(); 
    try { 
    main; 
    } finally { 
    supThread.interrupt(); 
    } 
} 

이 같은 행동이 스칼라의 동시 라이브러리를 사용하여 얻을 수 있습니다 : 현재, 나는 표준 자바 스레드를 사용하여 구현했습니다?

+0

http://stackoverflow.com/questions/14449862/kill-or-timeout-a-future-in-scala -2-10/14450095 # 14450095 – sourcedelica

+0

Java API를 사용한 구현은 신뢰할 수 없습니다. 인터럽트가 항상 예상대로 작동하지 않으므로 사용하지 않아야합니다. 조기 종료를 명시 적으로 코딩하는 것이 좋습니다. 위의 주석에 링크되어있는 대답과 같습니다. AtomicBoolean 공유는 가능한 많은 솔루션 중 하나입니다. –

답변

4

하지 스칼라 표준 선물 (AFAIK)와,하지만 Twitter's Util library을 지원하지 않습니다 :

val future = Future { sup } 
future.cancel() // in 5.x 
future.raise(new FutureCancelledException) // in 6.x 
+0

스칼라 표준 라이브러리에 2 년 동안 이에 상응하는 것이 있습니까? –

+0

직접적으로 아니지만, http://stackoverflow.com/a/16010193/9204를 참조하십시오. –