Last Updated: July 15, 2016
·
3.031K
· colindean

Don't use Future.firstCompletedOf with two futures for timeouts

Do not create two futures expecting one to act as a timeout with a Thread.sleep. If the real operation completes, the timeout future will continue running. If you do this a lot, you will exhaust your thread pool on timeout futures blocking threads.

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(_))

This will show you the dangers of this approach. Instead, use a TimeoutScheduler. If you need a HashedWheelTimer implementation, checkout this one: https://github.com/ifesdjeen/hashed-wheel-timer