2013-03-10 14 views
5

Ho bisogno di eseguire due calcoli paralleli e interrompere il primo quando termina il secondo. Attualmente, ho implementato utilizzando thread Java standard:Come interrompere i calcoli asincroni in Scala?

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

Può lo stesso comportamento essere raggiunto utilizzando la libreria concomitante di Scala, senza l'utilizzo di Thread s esplicitamente?

+0

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

+0

L'implementazione con l'API Java non è affidabile: l'interrupt non funziona sempre come previsto e probabilmente non dovrebbe mai essere utilizzato. È preferibile codificare esplicitamente la terminazione anticipata, ad es. come nella risposta collegata nel commento sopra. La condivisione di un AtomicBoolean è una delle (molte) possibili soluzioni. –

risposta

4

Non con i futures standard di Scala (AFAIK), ma Twitter's Util library non sostenerlo:

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

C'è qualche equivalente a questo nella libreria standard di Scala ora, a 2 anni secondo le tue conoscenze? –

+0

Non direttamente, ma consultare http://stackoverflow.com/a/16010193/9204 e in particolare la discussione nei commenti. –

Problemi correlati