Vin*_*gio 9 concurrency scala future
我试图在新的Scala 2.10 期货功能上重现这个例子.我使用的代码是:
import scala.concurrent.Future
import scala.concurrent.future
object Test {
def main(args: Array[String]) {
println("Test print before future")
val s = "Hello"
val f = future {s + " future!"}
f onSuccess {case v => println(v)}
println("Test print after future")
}
}
Run Code Online (Sandbox Code Playgroud)
而不是打印:
Test print before future
Hello future!
Test print after future
Run Code Online (Sandbox Code Playgroud)
它只是打印:
Test print before future
Test print after future
Run Code Online (Sandbox Code Playgroud)
知道为什么我有这种行为吗?我的scala编译器版本是2.10.0-20120507.
Hea*_*ler 30
问题是你正在执行它作为一个独立的程序,其主线程在其中一个工作线程可以执行"Hello future!"之前终止.println.(新期货库产生的线程是守护线程).
您还可以使用该Await对象(也在scala.concurrent)中等待,直到将来f完成:
import scala.concurrent._
import scala.concurrent.util._
object Test {
def main(args: Array[String]) {
println("Test print before future")
val s = "Hello"
val f = future {s + " future!"}
f onSuccess {case v => println(v)}
println("Test print after future")
Await.ready(f, Duration.Inf)
}
}
Run Code Online (Sandbox Code Playgroud)
这可以打印:
Test print before future
Test print after future
Hello future!
Run Code Online (Sandbox Code Playgroud)
或者,它可以打印"Hello future!" 在"将来测试打印"之前,取决于线程安排.
同样,您可以强制主线程等到f最后一个完成println,如下所示:
import scala.concurrent._
import scala.concurrent.util._
object Test {
def main(args: Array[String]) {
println("Test print before future")
val s = "Hello"
val f = future {s + " future!"}
f onSuccess {case v => println(v)}
Await.ready(f, Duration.Inf)
println("Test print after future")
}
}
Run Code Online (Sandbox Code Playgroud)
哪个会打印:
Test print before future
Hello future!
Test print after future
Run Code Online (Sandbox Code Playgroud)
但请注意,当您使用时Await,您将被阻止.这当然有必要确保您的主应用程序线程不会终止,但除非另有必要,否则通常不应使用.
(该Await对象是一个必要的逃生舱口像这些情况,但使用它在整个应用程序的代码,而其语义的关注可能会导致慢,并行少执行.如果您需要确保回调在一些特定的顺序执行,例如,还有其他选择,例如andThen和map方法Future.)
| 归档时间: |
|
| 查看次数: |
2999 次 |
| 最近记录: |