# 持续时间 持续时间(`Duration`)在整个 Akka 库中使用,因此这个概念由一个特殊的数据类型`scala.concurrent.duration.Duration`表示。此类型的值可以表示无限(`Duration.Inf`、`Duration.MinusInf`)或有限的持续时间,也可以表示未定义的持续时间(`Duration.Undefined`)。 ## 依赖 为了使用`Duration`,你需要将以下依赖添加到你的项目中: ```xml com.typesafe.akka akka-actor_2.12 2.5.23 dependencies { compile group: 'com.typesafe.akka', name: 'akka-actor_2.12', version: '2.5.23' } libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.23" ``` ## 有限 vs. 无限 由于试图将无限的时间转换为具体的时间单位(如秒)会引发异常,因此在编译时可以使用不同的类型来区分这两种类型: - `FiniteDuration`保证是有限的,调用`toNanos`是安全的。 - `Duration`可以是有限的,也可以是无限的,所以这种类型应该只在有限性不重要时使用;这是`FiniteDuration`的一种超类型。 ## Scala 在 Scala 中,可以使用`mini-DSL`构造持续时间,并支持所有预期的算术运算: ```java import scala.concurrent.duration._ val fivesec = 5.seconds val threemillis = 3.millis val diff = fivesec - threemillis assert(diff < fivesec) val fourmillis = threemillis * 4 / 3 // you cannot write it the other way around val n = threemillis / (1 millisecond) ``` - **注释**:如果表达式被清晰地分隔(例如括号内或参数列表中),则可以省略点,但如果时间单位是一行中的最后一个标记,则建议使用点,否则,根据下一行的起始内容,分号推理可能会出错。 ## Java Java 提供较少的语法糖,因此你必须将操作拼写为方法调用,而不是: ```java import scala.concurrent.duration.Duration; import scala.concurrent.duration.Deadline; ``` ```java final Duration fivesec = Duration.create(5, "seconds"); final Duration threemillis = Duration.create("3 millis"); final Duration diff = fivesec.minus(threemillis); assert diff.lt(fivesec); assert Duration.Zero().lt(Duration.Inf()); ``` ## 最后期限 `Durations`有一个兄弟名为`Deadline`,它是一个类,它持有绝对时间点的表示,并且支持通过计算现在和最后期限(`deadline`)之间的差异来派生一个持续时间。如果你想保持一个完整的最后期限,而不必注意簿记(`book-keeping`)工作,这是有用的。时间的流逝可以表示为: ```java val deadline = 10.seconds.fromNow // do something val rest = deadline.timeLeft ``` 在 Java 中,利用持续时间创建这些: ```java final Deadline deadline = Duration.create(10, "seconds").fromNow(); final Duration rest = deadline.timeLeft(); ``` ---------- **英文原文链接**:[Duration](https://doc.akka.io/docs/akka/current/common/duration.html). ---------- ———— ☆☆☆ —— [返回 -> Akka 中文指南 <- 目录](https://codechina.csdn.net/monokai/akka-guide/blob/master/README.md) —— ☆☆☆ ————