1

在 Scala 2.10 中,与新的Future/ PromiseAPI 一起,他们引入了 aDurationDeadline实用程序(如此处所述)。我环顾四周,但找不到 scala 标准库附带的任何东西,比如:

val deadline = 5 seconds fromNow
After(deadline){
  //do stuff
}

//or

val deadlineFuture: Future[Nothing] = (5 seconds fromNow).asFuture
deadlineFuture onComplete {
  //do stuff
}

有没有类似的东西我错过了,还是我必须自己实施这种行为?

4

2 回答 2

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
}
于 2012-12-13T03:02:20.150 回答
0

它只是一个时间戳持有者。例如,您需要在 T 小时内分发 N 个顺序任务的执行。完成第一个任务后,您可以检查截止日期并根据(剩余时间)/(剩余任务)间隔安排下一个任务。在某个时间点isOverdue()发生,您只需并行执行剩下的任务。

或者您可以检查isOverdue(),如果仍然为假,则timeLeft()用于设置执行下一个任务的超时,例如。

Date这比使用和Calendar确定剩余时间要好得多。Duration 在 Akka 中也用于计时。

于 2012-12-13T01:44:35.330 回答