为什么我得到 "Future(<not completed>)"

Why am I getting "Future(<not completed>)"

开始学习 scala(和 futures)。

给定以下代码:

import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.util.{Failure, Success}

object MyFuture2 extends App {
  val twenty = Future{Thread.sleep(2000); 20}
  twenty onComplete {
    case Success(nums) => println("twenty onComplete: " + nums)
    case Failure(t) => println("An error has occurred: " + t.getMessage)
  }

  while (!twenty.isCompleted ) {
    Thread.sleep(500)
  }
  println("Step 1: " + twenty)

  val myresult = for {
    bb: Int <- twenty
  } yield {
    bb * 2
  }

  println("Step 2: " + myresult)
}

输出为

twenty onComplete: 20
Step 1: Future(Success(20))
Step 2: Future(<not completed>)

"Step 2: Future()" 没有意义,因为几乎在前面的立即声明中,二十已经完成,否则不会打印出 "第 1 步:未来(成功(20))”。预期值为 40 (20 * 2).

我对 Future 的使用方式的理解有什么问题?怎么可能第2步不完成!

谢谢。

请注意,第一部分也可以是简单的 val twenty = Future.successful(20)(它在您调用它的同一个线程上同步执行)并且结果是相同的(除非出于某种原因您很幸运日程安排)。

发生的情况如下:

  • 您有一个包含值 20
  • Future
  • 你在上面调用map(这是for理解的意思),它发送一个回调,将Future的内容乘以2到全局ExecutionContext 你导入的(恰好是一个 fork-join 池)

现在可能会发生两件事:

  • 最有可能的是,当前线程的执行会继续,您会得到 Future(<not completed>) 打印出来的
  • 也许(但不太可能),由于某种原因当前线程让出并调度乘以二的线程——数字乘以二并且当控制returns到另一个线程时, Future(40) 打印出来