根据我的理解,Future将由线程池中的新线程处理。同时,主线程可以继续进行不依赖于Future的结果的计算。
这来自https://www.playframework.com/documentation/2.4.x/ThreadPools,支持我的理解。
请注意,您可能想要将阻止代码包装在其中 期货。这不会使它无阻塞,它只是意味着 阻塞将发生在不同的线程中。你还需要做 确保您使用的线程池有足够的线程 处理阻止。
此外,在JVM中,线程中没有父子项的概念。换句话说,所有线程都被平等对待。这意味着,即使主线程完成,解决Future的线程也将继续运行。
但是,在下面的示例中,为什么当主线程完成时,Future线程也会被杀死。如果我没有在示例结尾处注释 sleep(10000),我可以看到Future结果。
val f3 = Future {
sleep(5000)
2
}
f3.onComplete {
case Success(value) => println(s"f3's result = $value")
case Failure(e) => e.printStackTrace
}
// do other work
println("A ...")
sleep(100)
println("B ...")
sleep(100)
println("C ...")
sleep(100)
println("D ...")
sleep(100)
println("E ...")
sleep(100)
println("F ...")
sleep(100)
// keep the JVM running
// sleep(10000)
def sleep(duration: Long) {
Thread.sleep(duration)
}