为何IntelliJ Worksheet不打印Thread.run定义的数字序列,sbt却正常?
问题原因与解决方案
这个问题我之前也碰到过,核心原因其实和主线程的生命周期以及IntelliJ Worksheet的输出机制有关,给你拆解下:
主线程退出速度差异:IntelliJ Worksheet执行完顶层代码后,主线程会立刻终止,JVM随之退出——这时候你启动的子线程可能还没来得及跑完输出逻辑就被强制结束了。而sbt Console会一直保持主线程活跃(等着用户输入新命令),子线程有足够的时间完成所有输出操作。
Worksheet的输出捕获限制:部分版本的Scala Worksheet对非主线程的标准输出支持不够完善,子线程打印的内容可能无法被Worksheet的结果面板正确捕获和展示,哪怕线程实际执行了,你也看不到输出。
几个可行的解决办法:
- 让主线程等一等子线程:在启动线程后调用
join()方法,强制主线程等待子线程执行完毕再退出,代码示例:
val printThread = new Thread { override def run(): Unit = (1 to 10).foreach(i => print(s"$i ")) } printThread.start() printThread.join() // 主线程等待子线程完成
- 用Future配合Await(更Scala风格):如果是用Future实现的异步逻辑,可以用
Await.result来等待异步任务完成:
import scala.concurrent.{Await, Future} import scala.concurrent.duration._ import scala.concurrent.ExecutionContext.Implicits.global val printTask = Future { (1 to 10).foreach(i => print(s"$i ")) } Await.result(printTask, 5.seconds) // 最多等待5秒
- 调整Worksheet的设置:打开IntelliJ的
Settings → Languages & Frameworks → Scala → Worksheet,试试开启"Run worksheet in interactive mode",或者把输出模式改成"Show in separate window",有些场景下能解决非主线程输出捕获的问题。
内容的提问来源于stack exchange,提问作者zell
相关产品推荐
相关产品推荐

