You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:35:21