在Future完成之前退出应用程序

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)