持续时间

持续时间(Duration)在整个 Akka 库中使用,因此这个概念由一个特殊的数据类型scala.concurrent.duration.Duration表示。此类型的值可以表示无限(Duration.InfDuration.MinusInf)或有限的持续时间,也可以表示未定义的持续时间(Duration.Undefined)。

依赖

为了使用Duration,你需要将以下依赖添加到你的项目中:

  1. <!-- Maven -->
  2. <dependency>
  3. <groupId>com.typesafe.akka</groupId>
  4. <artifactId>akka-actor_2.12</artifactId>
  5. <version>2.5.23</version>
  6. </dependency>
  7. <!-- Gradle -->
  8. dependencies {
  9. compile group: 'com.typesafe.akka', name: 'akka-actor_2.12', version: '2.5.23'
  10. }
  11. <!-- sbt -->
  12. libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.23"

有限 vs. 无限

由于试图将无限的时间转换为具体的时间单位(如秒)会引发异常,因此在编译时可以使用不同的类型来区分这两种类型:

  • FiniteDuration保证是有限的,调用toNanos是安全的。
  • Duration可以是有限的,也可以是无限的,所以这种类型应该只在有限性不重要时使用;这是FiniteDuration的一种超类型。

Scala

在 Scala 中,可以使用mini-DSL构造持续时间,并支持所有预期的算术运算:

  1. import scala.concurrent.duration._
  2. val fivesec = 5.seconds
  3. val threemillis = 3.millis
  4. val diff = fivesec - threemillis
  5. assert(diff < fivesec)
  6. val fourmillis = threemillis * 4 / 3 // you cannot write it the other way around
  7. val n = threemillis / (1 millisecond)
  • 注释:如果表达式被清晰地分隔(例如括号内或参数列表中),则可以省略点,但如果时间单位是一行中的最后一个标记,则建议使用点,否则,根据下一行的起始内容,分号推理可能会出错。

Java

Java 提供较少的语法糖,因此你必须将操作拼写为方法调用,而不是:

  1. import scala.concurrent.duration.Duration;
  2. import scala.concurrent.duration.Deadline;
  1. final Duration fivesec = Duration.create(5, "seconds");
  2. final Duration threemillis = Duration.create("3 millis");
  3. final Duration diff = fivesec.minus(threemillis);
  4. assert diff.lt(fivesec);
  5. assert Duration.Zero().lt(Duration.Inf());

最后期限

Durations有一个兄弟名为Deadline,它是一个类,它持有绝对时间点的表示,并且支持通过计算现在和最后期限(deadline)之间的差异来派生一个持续时间。如果你想保持一个完整的最后期限,而不必注意簿记(book-keeping)工作,这是有用的。时间的流逝可以表示为:

  1. val deadline = 10.seconds.fromNow
  2. // do something
  3. val rest = deadline.timeLeft

在 Java 中,利用持续时间创建这些:

  1. final Deadline deadline = Duration.create(10, "seconds").fromNow();
  2. final Duration rest = deadline.timeLeft();

英文原文链接Duration.