Duration

注:本节未经校验,如有问题欢迎提issue

Duration在Akka库中被广泛使用,这代表一个特殊的数据类型——scala.concurrent.duration.Duration。这个类型的值可以表示无限(Duration.Inf, Duration.MinusInf)或有限的时间段,或是Duration.Undefined

有限与无限

试图将无限的duration转换成一个具体的时间单位,如秒,将引发异常,在编译时有不同类型可用于区分两者:

  • FiniteDuration 保证是有限的,调用 toNanos 和相关方法是安全的
  • Duration可以是有限或无限的,因此这种类型只用与有限性并不重要的场合 ;这是 FiniteDuration 的超类。

Scala

在Scala,时间段可以通过一个迷你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());

Deadline

Duration 有一个兄弟类,名为 Deadline, 表示一个持有绝对的时间点的类,并且支持通过计算当前时间到deadline之间的差距来生成Duration。当你想要保持一个总体的期限,而无需记录——自己关注使用时间时,这非常有用:

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

在Java中使用duration来创建dealine:

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