Luo*_*inh 5 java multithreading scala playframework
据我了解,Future将由线程池中的新线程处理。同时,主线程可以继续执行不依赖于Future结果的计算。
这来自https://www.playframework.com/documentation/2.4.x/ThreadPools,支持我的理解。
请注意,因此您可能会倾向于将阻止代码包装在Future中。这并不是说非阻塞,而是意味着阻塞将在另一个线程中发生。您仍然需要确保所使用的线程池具有足够的线程来处理阻塞。
另外,在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)
}
Run Code Online (Sandbox Code Playgroud)