Não crie dois futuros esperando que um atue como um timeout com um Thread.sleep
. Se a operação real for concluída, o tempo limite futuro continuará em execução. Se você fizer muito isso, esgotará seu pool de threads em threads de bloqueio de futuros de tempo limite.
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val t = Future.firstCompletedOf( List(
Future {
1.to(10).foreach { int =>
println("1: " + int)
Thread.sleep(100)
}
"1"
},
Future {
1.to(10).foreach { int =>
println("2: " + int)
Thread.sleep(200) }
"2"
} ) )
t.onComplete(println(_))
Isso mostrará os perigos dessa abordagem. Em vez disso, use um TimeoutScheduler . Se você precisar de uma implementação HashedWheelTimer, verifique esta: https://github.com/ifesdjeen/hashed-wheel-timer