为啥 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 会先选择休眠期较长的未来呢?

是否可以在进程之间传递 Python Future 对象?

为啥 Youtube/Google API 不返回超过 5 个回复?

Java多线程Future模式