Фьючерсы очень удобны, но на практике вам могут потребоваться некоторые гарантии их исполнения. Например, рассмотрим:
import scala.actors.Futures._
def slowFn(time:Int) = {
Thread.sleep(time * 1000)
println("%d second fn done".format(time))
}
val fs = List( future(slowFn(2)), future(slowFn(10)) )
awaitAll(5000, fs:_*)
println("5 second expiration. Continuing.")
Thread.sleep(12000) // ie more calculations
println("done with everything")
Идея состоит в том, чтобы запустить несколько медленно работающих функций параллельно. Но мы не хотим зависать вечно, если функции, выполняемые фьючерсами, не возвращаются. Поэтому мы используем awaitAll (), чтобы установить тайм-аут на фьючерсы. Но если вы запустите код, вы увидите, что 5-секундный таймер истекает, но 10-секундное будущее продолжает работать и возвращается позже. Тайм-аут не убивает будущее; это просто ограничивает время ожидания соединения.
Итак, как вы убиваете будущее после периода ожидания? Похоже, что фьючерсы не могут быть использованы на практике, если вы не уверены, что они вернутся через известное время. В противном случае вы рискуете потерять потоки в пуле потоков из не завершающихся фьючерсов, пока их не останется.
Итак, вопросы: как вы убиваете фьючерсы? Каковы предполагаемые модели использования фьючерсов с учетом этих рисков?