Если вам нужна только обработка по принципу "забыл и забыл", почему бы не использовать фьючерсы Scala?
import scala.actors.Futures._
def example = {
val answers = (1 to 4).map(x => future {
Thread.sleep(x*1000)
println("Slept for "+x)
x
})
val t0 = System.nanoTime
awaitAll(1000000,answers: _*) // Number is timeout in ms
val t1 = System.nanoTime
printf("%.3f seconds elapsed\n",(t1-t0)*1e-9)
answers.map(_()).sum
}
scala> example
Slept for 1
Slept for 2
Slept for 3
Slept for 4
4.000 seconds elapsed
res1: Int = 10
По сути, все, что вам нужно, это поместить нужный код в блок future { }
, и он будетнемедленно вернуть будущее;примените его, чтобы получить ответ (он будет заблокирован, пока не будет выполнено), или используйте awaitAll
с таймаутом для ожидания, пока все не закончат.
Обновление: с 2.11 способ сделать этос scala.concurrent.Future
.Перевод приведенного выше кода:
import scala.concurrent._
import duration._
import ExecutionContext.Implicits.global
def example = {
val answers = Future.sequence(
(1 to 4).map(x => Future {
Thread.sleep(x*1000)
println("Slept for "+x)
x
})
)
val t0 = System.nanoTime
val completed = Await.result(answers, Duration(1000, SECONDS))
val t1 = System.nanoTime
printf("%.3f seconds elapsed\n",(t1-t0)*1e-9)
completed.sum
}