我正在构建一个方法,它需要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()' –