鉴于此代码:
object Test {
import scala.concurrent.ExecutionContext.Implicits.global
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => println(name)
case Failure(t) => t.printStackTrace()
}
}
}
我看不到输出,但是将println更改为System.out.println有效:
object Test {
import scala.concurrent.ExecutionContext.Implicits.global
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => System.out.println(name)
case Failure(t) => t.printStackTrace()
}
}
}
同样使用带有标准线程的println也可以:
object Test {
def main(args: Array[String]): Unit = {
val t = new Thread() {
override def run(): Unit = println("Test")
}
t.start()
t.join()
}
}
为什么会这样?
答案 0 :(得分:4)
您必须等待Future
完成。因此,您的System.out.println
版本也可能输出。
object Test {
import scala.concurrent.ExecutionContext.Implicits.global
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => println(name)
case Failure(t) => t.printStackTrace()
}
Await.result(f)
}
}
答案 1 :(得分:3)
Future和onComplete在分离的守护程序线程中执行。当主线程终止时(在最后一条指令之后),守护程序线程也会终止。在您的情况下,他们没有时间执行代码。让您的主要代码保持较长时间,例如Thread.sleep(100)
。
答案 2 :(得分:0)
因为你的程序退出了:
def main(args: Array[String]): Unit = {
val f: Future[String] = Future { "Test" }
f.onComplete {
case Success(name) => println(name)
case Failure(t) => t.printStackTrace()
}
Thread.sleep(100)
}
答案 3 :(得分:0)
所以答案似乎在于this answer。 Scala的println不是System.out.println的别名,而是以不同方式处理线程的Console.println