我正在構建一個方法,它需要x大小的方法序列並返回第一個方法的結果完成。斯卡拉 - 多線程,當任何子線程完成時完成主線程
def invokeAny(work: Seq[() => Int]): Int = ???
如何通過使用線程來完成此操作? (不允許期貨)
這是我已經能夠提出的最好的,但似乎不適用於所有情況。
def invokeAny(work: Seq[() => Int]): Int = {
@volatile var result = 0 // set to return value of any work function
val main = Thread.currentThread()
val threads: Seq[Thread] = work.map(work => new Thread(new Runnable {
def run { result = work(); main.interrupt(); }}))
threads.foreach(_.start())
for(thread <- threads) {
try {
thread.join()
} catch {
// We've been interrupted: finish
case e: InterruptedException => return result
}
}
return result
}
我會建議,而不是使用線程 –
啊,我知道期貨,但我想知道如何使用線程 – Leero11
使用值爲1的'java.util.concurrent.CountDownLatch'。你的子線程會調用'latch.countDown()',主線程將使用'latch.await()' –