Não use Future.firstCompletedOf com dois futuros para tempos limite

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