【问题标题】:Scala - futures does not runScala - 期货不运行
【发布时间】:2013-05-03 11:39:11
【问题描述】:

我正在尝试运行以下未来的基本代码

 future { println("ssss")} onSuccess{ case _ => println("succ")}

但是,当我运行 main 方法时,控制台没有打印任何内容,并且系统几乎立即退出。我正在使用隐式 ExecutionContext。有什么提示吗?

这段代码:

  val f = future(Await.ready(Promise().future, d.timeLeft))

   f.onSuccess {
     case _ => println("hee")
   }

也立即退出....

【问题讨论】:

标签: scala concurrency future


【解决方案1】:

Future 在专用线程池上执行。如果你的主程序不等待未来,它将立即退出,未来将没有机会执行。 你可以在这里做的是在你的主程序中使用Await来阻塞主线程,直到未来执行:

def main( args: Array[String] ) {
  val fut = future { println("ssss")}
  fut onSuccess{ case _ => println("succ")}
  Await.result( fut )
}

【讨论】:

  • 我基本上喜欢 Scala 中的 Java future.get() 阻塞行为,是使用 Await 实现的吗?
  • 是的,这将等待结果并返回它(或者如果未来失败则重新抛出异常)。
  • 那么,如果 OnSuccess 在单独的线程上运行并且在我们真正要求结果之前不传播结果,那么它的意义何在?我们可以简单地在主线程上请求结果,然后根据成功/失败执行某事,对吗?
  • 在这种简单的情况下,没有意义,就像生成一个线程只是为了无限期地等待它(通过Thread.join)是没有用的。使用期货的原因与使用线程的原因大体相同。但是,future 有一个额外的优势,即更容易组合、更简单的抽象以及比原始线程(或者等效地,如果您已经使用线程池)更好地扩展。
猜你喜欢
  • 2015-08-25
  • 2016-07-11
  • 2018-08-04
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
相关资源
最近更新 更多