【问题标题】:Scala Future not printing resultsScala Future 不打印结果
【发布时间】:2018-04-07 00:20:52
【问题描述】:

我正在使用以下代码学习 Scala Future:

object DangerousAndSlowService {
    def queryNextNumber: Long = {
        50
    }
}

val number1F = Future { DangerousAndSlowService.queryNextNumber }

number1F.onComplete({
    case Success(value) => {
        println(s"Got the callback, meaning = $value")
    }
    case Failure(exception) => {
        exception.printStackTrace
    }
})

但是,从不打印“50”。 已经花了几个小时,但仍然无法弄清楚。

谢谢。

【问题讨论】:

  • 这段代码是从哪里运行的?从主方法内部?
  • 你需要等待结果(阻塞当前线程)。检查此答案,您可以将其应用于您的示例:stackoverflow.com/a/49680248/5794617
  • "How do I wait for a Scala future's onSuccess callback to complete?" 不完全重复,问题在于另一个Thread.sleep
  • 值得注意的是,只有在程序实际上可能在运行Future 之前终止时才需要阻塞。如果运行此代码,例如在 Play 应用程序中,Future 应该会运行,即使您没有阻止并等待它

标签: scala


【解决方案1】:

主线程在没有让future完成它的工作的情况下退出,因此输出是不确定的:有时它会打印一些东西,有时它不会。如果不介意阻塞主线程,可以使用Await

import scala.concurrent.Future
import scala.util.{Success, Failure}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._

object DangerousAndSlowService {
    def queryNextNumber: Long = {
        50
    }
}

val number1F = Future { DangerousAndSlowService.queryNextNumber }

number1F.onComplete({
    case Success(value) => {
        println(s"Got the callback, meaning = $value")
    }
    case Failure(exception) => {
        exception.printStackTrace
    }
})

Await.result(number1F, 1.second)

虽然Await 是生成输出所必需的,但请注意您应该谨慎使用它。它阻塞了当前线程,当您使用异步计算和期货时,这通常不是您想要的。

【讨论】:

  • @JordanCuttler "bad" 听起来有点太主观了。如果您已经通过数千次异步计算组成了庞大的程序,那么最终您必须启动它并等待结果。你不应该随便阻止中间结果的计算,这是真的,但我通常不会称Await“坏”。
  • @Felix 在什么意义上它不是一个好的解决方案。你能举个例子,它没有给出想要的结果吗?
  • @Felix 您是否以某种方式将您的问题与此线程混淆了?我已经明确表示your question NOT 与此问题重复,因此您的问题不会因重复而被关闭。您不能仅仅因为它没有回答您的特定问题而进入一个不相关的线程来解决另一个问题并否决所有问题。
  • 啊抱歉没有得到这个
  • @Felix 我已经包含了一个更明确的免责声明,即此解决方案会阻塞主线程。我并没有声称这适用于所有情况(尤其是不适用于 Play 或 Akka 等异步框架),但有时没有其他方法。
猜你喜欢
  • 2023-03-22
  • 2019-09-16
  • 2019-01-07
  • 2019-03-11
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多