为什么我得到 "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)
打印出来
开始学习 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
的 - 你在上面调用
map
(这是for
理解的意思),它发送一个回调,将Future
的内容乘以2到全局ExecutionContext
你导入的(恰好是一个 fork-join 池)
Future
现在可能会发生两件事:
- 最有可能的是,当前线程的执行会继续,您会得到
Future(<not completed>)
打印出来的 - 也许(但不太可能),由于某种原因当前线程让出并调度乘以二的线程——数字乘以二并且当控制returns到另一个线程时,
Future(40)
打印出来