期货在计划终止前不会运行

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对象是一个必要的逃生舱口像这些情况,但使用它在整个应用程序的代码,而其语义的关注可能会导致慢,并行少执行.如果您需要确保回调在一些特定的顺序执行,例如,还有其他选择,例如andThenmap方法Future.)