首页 > 解决方案 > 为什么 Future(1) 在 repl 和已编译的 prog 之间返回不同的结果?

问题描述

在 repl 中使用未来:

scala> val a=Future{1}
a: scala.concurrent.Future[Int] = Future(<not completed>)

scala> a.value
res0: Option[scala.util.Try[Int]] = Some(Success(1))

返回一些(成功(1))

在 IDEA 中使用它:

object A extends App{
 val a=Future{1}
 println(a.value)
}

返回无:

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe"...
None

为什么?没有像Thread.Sleep这样的东西,所以在任何情况下,我认为Future会立即返回,给我一些(成功(1))

谢谢!

标签: scalaasynchronousfuture

解决方案


Future是异步执行的。它被提交到线程池队列,其中一个可用线程最终将其拾取并执行。

当您在 repl 中运行时(可能在 IO 期间),当前线程失去控制,上下文切换,另一个线程有机会从队列中获取任务并完成它。

当它作为程序运行时,它a.value会立即执行a=Future,在同一个线程中,异步任务仍在队列中。


推荐阅读