2013-03-10 17 views
5

Muszę uruchomić dwie równoległe obliczenia i przerwać pierwszą, gdy kończy się druga. Obecnie mam wprowadziły go przy użyciu standardowych wątki Java:Jak przerwać obliczenia asynchroniczne w Scali?

/** 
* 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(); 
    } 
} 

Czy to samo zachowanie osiągnąć za pomocą jednoczesnego biblioteki Scala, bez użycia Thread s jawnie?

+0

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

+0

Twoja implementacja z API Javy nie jest niezawodna - przerywanie nie zawsze działa zgodnie z oczekiwaniami i prawdopodobnie nigdy nie powinno być używane. Lepiej kodować wyraźnie dla wcześniejszego zakończenia - np. jak w odpowiedzi powiązanej w powyższym komentarzu. Udostępnianie AtomicBoolean jest jednym z (wielu) możliwych rozwiązań. –

Odpowiedz

4

Nie ze standardowymi Scala futures (AFAIK), ale Twitter's Util library nie obsługuje go:

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

Czy istnieje odpowiednik tego w bibliotece standardowej Scala teraz, 2 lata później do twojej wiedzy? –

+0

Nie bezpośrednio, ale patrz http://stackoverflow.com/a/16010193/9204, a zwłaszcza dyskusja w komentarzach. –