gpt4 book ai didi

scala - 为什么我的简单 Scala 对象在包含 future 时会挂起一分钟左右

转载 作者:行者123 更新时间:2023-12-02 06:57:27 26 4
gpt4 key购买 nike

我正在学习 scala futures,我已经回答了我的问题。我有一个非常简单的例子

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.util.{Failure, Success}
/**
* Created by dummy on 05/02/15.
*/
object FutureUtils extends App{

val f = Future {
Thread.sleep(1000)
println("I am learning scala futures")
"learning"
}

f onComplete {

case Success(value:String) => println("got the response back")
case Failure(t: Throwable) => println("did not expect this")

}

println("I am still learning")

}

当我按原样运行程序时,输出从不打印

got the response back

相反,它看起来像是挂起一分钟左右,并且没有打印出预期的输出就结束了。我确定我在这里遗漏了一些非常基本的东西。

我还尝试在末尾添加 System.in.read() ,似乎当我输入任何虚拟值时,程序结束打印预期结果。这种行为背后的原因是什么?谁能帮助我理解这一点?

最佳答案

没有 System.in.read() 程序无法运行的原因是 onComplete 在 future 完成之前不会阻塞,而只是为当它发生时。该回调永远不会被执行,因为整个程序在 future 完成之前就结束了。要解决此问题,您可以故意让主线程进入无限循环并在回调中显式终止进程。

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

object Main extends App {
val f = Future {
Thread.sleep(1000)
println("I am learning scala futures")
"learning"
}
f onComplete {
case Success(value:String) => println("got the response back"); System.exit(0)
case Failure(t: Throwable) => println("did not expect this"); System.exit(1)
}
println("I am still learning")
while (true){
Thread.sleep(1000)
}
}

关于scala - 为什么我的简单 Scala 对象在包含 future 时会挂起一分钟左右,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28352132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com