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

为何在IntelliJ中运行Scala代码时Future始终无法完成?

这是特性而非Bug

现象回顾

在Scala Shell中运行这段代码能正常打印"Hello":

implicit val ec = ExecutionContext.Implicits.global
def f(): Future[String] = Future("Hello")
f().foreach(println)

但在IntelliJ的Application Configuration中运行时,完全没有输出;而在末尾添加println("World")后,会先输出"Hello"再输出"World"。

原因解析

问题的核心在于Scala默认的全局执行上下文ExecutionContext.Implicits.global使用的是守护线程池。JVM有明确规则:当所有非守护线程都结束时,会直接终止整个进程,不会等待守护线程完成任务。

  • Scala Shell本身是持续运行的交互环境,主线程不会立即退出,所以守护线程有足够时间执行Future里的任务,自然能打印出结果。
  • 用IntelliJ运行Application时,主线程执行完f().foreach(println)后就会立刻结束,此时Future的任务还没来得及在守护线程中执行,进程就被JVM强制终止了,所以看不到任何输出。添加println("World")相当于给主线程延长了存活时间,让守护线程有机会完成Future的任务,因此能看到输出。

结论

这是Scala默认执行上下文的设计特性,不是Bug。如果需要确保Future任务执行完成后再结束进程,可以显式等待Future完成,比如用Await.result:

import scala.concurrent.Await
import scala.concurrent.duration._

implicit val ec = ExecutionContext.Implicits.global
def f(): Future[String] = Future("Hello")
val future = f()
future.foreach(println)
Await.result(future, 1.second)

内容的提问来源于stack exchange,提问作者user79074

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:42:39