使用期货和 Thread.sleep
Using futures and Thread.sleep
通过执行这段scala代码,我在控制台中没有任何输出。 (我不太明白这是怎么回事)
如果我删除 Console.println("Console.println OK!")
=> 一切似乎都很好。
如果我删除 Thread.sleep(2000)
=> 一切似乎都很好。
你对此有什么想法吗?非常感谢!
克莱门特
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scala.concurrent.{Await, Future}
import scala.language.postfixOps
object ScalaFuture {
def main(args: Array[String]) {
val f: Future[String] = Future {
Thread.sleep(2000)
"future value"
}
f.onSuccess {
case s => {
Console.println("Console.println OK!")
System.out.println("System.out.println OK!")
}
}
Await.ready(f, 60 seconds)
}
}
你的 await 正在等待 future 完成,它在 2 秒后完成,但它不等待 onSuccess
处理程序,它在另一个线程中执行(类似于 future),而是在 Await.ready(f, 60 seconds)
,所以进程在你打印之前退出。要正确处理它 - 为 onComplete
:
创造新的未来
val f: Future[String] = Future {
Thread.sleep(2000)
"future value"
}
val f2 = f map { s =>
println("OK!")
println("OK!")
}
Await.ready(f2, 60 seconds)
println("exit")
Await.ready(f, ...)
的结果:
exit
OK!
OK!
Await.ready(f2, ...)
的结果:
OK!
OK!
exit
只需将 readLine() 放入您的代码中即可。
通过执行这段scala代码,我在控制台中没有任何输出。 (我不太明白这是怎么回事)
如果我删除 Console.println("Console.println OK!")
=> 一切似乎都很好。
如果我删除 Thread.sleep(2000)
=> 一切似乎都很好。
你对此有什么想法吗?非常感谢!
克莱门特
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scala.concurrent.{Await, Future}
import scala.language.postfixOps
object ScalaFuture {
def main(args: Array[String]) {
val f: Future[String] = Future {
Thread.sleep(2000)
"future value"
}
f.onSuccess {
case s => {
Console.println("Console.println OK!")
System.out.println("System.out.println OK!")
}
}
Await.ready(f, 60 seconds)
}
}
你的 await 正在等待 future 完成,它在 2 秒后完成,但它不等待 onSuccess
处理程序,它在另一个线程中执行(类似于 future),而是在 Await.ready(f, 60 seconds)
,所以进程在你打印之前退出。要正确处理它 - 为 onComplete
:
val f: Future[String] = Future {
Thread.sleep(2000)
"future value"
}
val f2 = f map { s =>
println("OK!")
println("OK!")
}
Await.ready(f2, 60 seconds)
println("exit")
Await.ready(f, ...)
的结果:
exit
OK!
OK!
Await.ready(f2, ...)
的结果:
OK!
OK!
exit
只需将 readLine() 放入您的代码中即可。