在Scala 2.10中,它们与新的Future
/ Promise
API一起引入了Duration
和Deadline
实用程序(as described here)。我环顾四周,但找不到scala标准库附带的任何东西,做类似的事情:
val deadline = 5 seconds fromNow
After(deadline){
//do stuff
}
//or
val deadlineFuture: Future[Nothing] = (5 seconds fromNow).asFuture
deadlineFuture onComplete {
//do stuff
}
有什么类似的东西我错过了,还是我必须自己实施这种行为?
答案 0 :(得分:4)
不完全内置,但它们提供足够的绳索。
要点是等待一个必须令人失望的空洞承诺(即超时)。
import scala.concurrent._
import scala.concurrent.duration._
import scala.util._
import ExecutionContext.Implicits.global
object Test extends App {
val v = new SyncVar[Boolean]()
val deadline = 5 seconds fromNow
future(Await.ready(Promise().future, deadline.timeLeft)) onComplete { _ =>
println("Bye, now.")
v.put(true)
}
v.take()
// or
val w = new SyncVar[Boolean]()
val dropdeadline = 5 seconds fromNow
val p = Promise[Boolean]()
p.future onComplete {_ =>
println("Bye, now.")
w.put(true)
}
Try(Await.ready(Promise().future, dropdeadline.timeLeft))
p trySuccess true
w.take()
// rolling it
implicit class Expiry(val d: Deadline) extends AnyVal {
def expiring(f: =>Unit) {
future(Await.ready(Promise().future, d.timeLeft)) onComplete { _ =>
f
}
}
}
val x = new SyncVar[Boolean]()
5 seconds fromNow expiring {
println("That's all, folks.")
x.put(true)
}
x.take() // wait for it
}
答案 1 :(得分:0)
它只是一个时间戳持有者。例如,您需要在T小时内分发N个连续任务的执行。完成第一个任务后,根据(剩余时间)/(任务剩余)间隔检查截止日期并安排下一个任务。在某个时间点isOverdue()
发生,您只需并行执行任务。
或者你可以检查isOverdue()
,如果仍然是假,例如使用timeLeft()
来设置执行下一个任务的超时时间。
比使用Date
和Calendar
进行操纵以确定剩余时间要好得多。此外,Akka还使用了持续时间。