scala - 为什么 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))
谢谢!
解决方案
Future
是异步执行的。它被提交到线程池队列,其中一个可用线程最终将其拾取并执行。
当您在 repl 中运行时(可能在 IO 期间),当前线程失去控制,上下文切换,另一个线程有机会从队列中获取任务并完成它。
当它作为程序运行时,它a.value
会立即执行a=Future
,在同一个线程中,异步任务仍在队列中。
推荐阅读
- python-3.x - 不同的 Selenium 版本有哪些改进
- mysql - 如何防止 SELECT 在另一个事务完成之前读取表
- python - 如何使用 currentIndex() 获取 itemFromIndex 中项目的另一个值?
- c# - MapHub to specific route
- excel - Summing specific rows in a column based on a condition
- amazon-web-services - Connect two VPC via AWS transit gateway Cloudformation
- python - 已安装 numpy 但无法导入
- react-native - Vue native、NativeScript Vue——它们允许自定义组件吗?
- c# - 托管 DataGrid 时 WPF TabControl 无法切换选项卡
- aws-lambda - 使用 with_together 时如何访问字典列表