With credit to the other answers - in the absence of any standard library function, I've gone down the Futures route.
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.concurrent.duration._
def runWithTimeout[T](timeoutMs: Long)(f: => T) : Option[T] = {
Some(Await.result(Future(f), timeoutMs milliseconds))
}
def runWithTimeout[T](timeoutMs: Long, default: T)(f: => T) : T = {
runWithTimeout(timeoutMs)(f).getOrElse(default)
}
So that
@Test def test {
runWithTimeout(50) { "result" } should equal (Some("result"))
runWithTimeout(50) { Thread.sleep(100); "result" } should equal (None)
runWithTimeout(50, "no result") { "result" } should equal ("result")
runWithTimeout(50, "no result") { Thread.sleep(100); "result" } should equal("no result")
}
I'd be grateful for any feedback as to whether this is a good Scala style!
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…