【问题标题】:Why Future(1) return diffrent result between repl and compiled prog?为什么 Future(1) 在回复和编译程序之间返回不同的结果?
【发布时间】:2021-06-10 01:11:49
【问题描述】:

在repl中使用future:

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 会立即返回,给我 Some(Successs(1))

谢谢!

【问题讨论】:

  • REPL 很慢,你必须打印上一个结果,读取下一行,解析它,执行它,打印它。 - 不是火箭科学。
  • 谢谢!所以程序很快,但我只让future返回一个值1,即使它很快,它也不能立即返回1?
  • 不,因为创建未来意味着在线程池中调度任务,这是一项昂贵的操作。如果你想返回一个未来已经完成的使用Future.succesful(1)
  • 您可以Await.result查看所需的结果。

标签: scala asynchronous future


【解决方案1】:

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

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

作为程序运行时,a.value 紧跟在a=Future 之后执行,在同一个线程中,异步任务仍在队列中。

【讨论】:

    猜你喜欢
    • 2010-10-31
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2012-07-28
    • 2013-03-10
    相关资源
    最近更新 更多