Scala技术问题:存在未完成Future时程序能否退出及示例验证
Scala中未完成的Future会阻止程序退出吗?
我来帮你拆解这两个问题:
1. 第一个示例中,程序会等Future完成后再退出吗?
答案是不会。原因和Scala默认的线程池机制有关:Future默认使用的ExecutionContext.global里的线程都是守护线程。JVM的退出规则很明确:只要所有非守护线程都执行完毕,JVM会直接终止,完全不管守护线程有没有完成任务。
看你的代码:
def main(args: Array[String]): Unit = { val future: Future[Unit] = myFunction() }
main方法运行在主线程(非守护线程)里,当main执行到最后一行(仅仅创建了Future),这个主线程就结束了。此时JVM找不到其他在运行的非守护线程,会立刻退出,根本不会等Future里的任务跑完。
2. 需要用Await来确保Future终止吗?
是的,如果你想让程序等Future完成后再退出,Await是最直接的方案。
比如你写的这段代码:
def main(args: Array[String]): Unit = { val future: Future[Unit] = myFunction() Await.result(future, Duration.Inf) }
Await.result会阻塞当前的主线程(非守护线程),直到Future完成或者达到你指定的超时时间。这里用Duration.Inf表示无限等待,所以主线程会一直卡在这里,直到Future里的任务执行完毕才会结束,这时JVM才会正常退出。
额外提一句:除了Await,你也可以用CountDownLatch配合Future.onComplete来实现类似的等待逻辑,但Await在这种简单场景下是最简洁直观的选择。
内容的提问来源于stack exchange,提问作者AXEL BORJA
相关产品推荐
相关产品推荐

