未来未完成,但看起来已经完成

时间:2018-11-08 11:14:29

标签: scala

我是一名Scala新手,试图了解期货。我在REPL中输入了以下内容:

scala> import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global

scala> import scala.concurrent.Future
import scala.concurrent.Future

scala> val m = Future(println("Message"))
Message
m: scala.concurrent.Future[Unit] = Future(<not completed>)

scala> Future(println("Another Message"))
res4: scala.concurrent.Future[Unit] = Future(<not completed>)
Another Message

在第一种情况下,我要将Future计算分配给变量m。我还没有打电话给m,但是Future实际上会产生“消息”字符串输出。但是我也收到一条Future(<not completed>)消息。这里发生了什么?未来是否完成?字符串输出告诉我它有。有人可以帮我清理一下吗?

2 个答案:

答案 0 :(得分:2)

Future将在创建后立即开始执行(取决于ExecutionContext实现并假定有可用的资源来运行它。)

您看到消息已打印到控制台这一事实表明您的期货已经完成。

尝试以下操作,看看会发生什么:

Future{
  Thread.sleep(5000)
  println("Message")
}

答案 1 :(得分:1)

已完成,您看到的Future(<not completed>)只是Future的`toString()。

尝试:

import scala.concurrent.ExecutionContext.Implicits.global

val f = scala.concurrent.Future{
  println("Message")
}

println(f.toString())

未来总是急切地执行。