为啥 Future(1) 在回复和编译程序之间返回不同的结果?
Posted
技术标签:
【中文标题】为啥 Future(1) 在回复和编译程序之间返回不同的结果?【英文标题】:Why Future(1) return diffrent result between repl and compiled prog?为什么 Future(1) 在回复和编译程序之间返回不同的结果? 【发布时间】:2021-06-10 01:11:49 【问题描述】:在repl中使用future:
scala> val a=Future1
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=Future1
println(a.value)
返回无:
"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe"...
None
为什么?没有像 Thread.Sleep 这样的东西,所以在任何情况下,我认为 Future 会立即返回,给我 Some(Successs(1))
谢谢!
【问题讨论】:
REPL 很慢,你必须打印上一个结果,读取下一行,解析它,执行它,打印它。 - 不是火箭科学。 谢谢!所以程序很快,但我只让future返回一个值1,即使它很快,它也不能立即返回1? 不,因为创建未来意味着在线程池中调度任务,这是一项昂贵的操作。如果你想返回一个未来已经完成的使用Future.succesful(1)
您可以Await.result
查看所需的结果。
【参考方案1】:
Future
是异步执行的。它被提交到线程池队列,其中一个可用线程最终将其拾取并执行。
当你在 repl 中运行时,某个地方(可能在 IO 期间),当前线程失去控制,上下文切换,另一个线程有机会从队列中获取任务并完成它。
作为程序运行时,a.value
紧跟在a=Future
之后执行,在同一个线程中,异步任务仍在队列中。
【讨论】:
以上是关于为啥 Future(1) 在回复和编译程序之间返回不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章
KafkaProducer:`callback`和返回的`Future`之间的区别?
为啥 ExecutorService.submit(Runnable task) 返回 Future<?> 而不是 Future<Void>?
为啥 Future::select 会先选择休眠期较长的未来呢?