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

Scala异步处理无输出问题求助:如何实现无Thread.sleep的结果输出?

解决Scala异步Future无输出且替换Thread.sleep的方案

你的代码没输出的核心原因是:主线程启动完所有Future后直接退出了,而Future的任务是在后台线程池执行的,还没来得及打印,程序就终止了。另外,Thread.sleep是阻塞操作,会占用线程池资源,需要换成非阻塞的延迟方式。

实现步骤及代码

  1. 替换阻塞的Thread.sleep为非阻塞延迟:通过调度器实现非阻塞延迟,避免占用线程池线程。
  2. 等待所有Future完成:将多个Future合并为一个,让主线程等待所有任务执行完毕再退出。

完整代码如下:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Future, Promise}
import scala.concurrent.duration._
import scala.concurrent.Await
import java.util.Date

def now(): Date = new Date()

// 非阻塞延迟函数,返回延迟指定时间后的Future
def delay(duration: FiniteDuration): Future[Unit] = {
  val promise = Promise[Unit]()
  val scheduler = java.util.concurrent.Executors.newSingleThreadScheduledExecutor()
  scheduler.schedule(() => {
    promise.success(())
    scheduler.shutdown()
  }, duration.length, duration.unit)
  promise.future
}

// 创建30个异步任务:先延迟2秒,再打印当前时间
val futures = (1 to 30).map(_ => delay(2.seconds).map(_ => println(now())))

// 等待所有任务完成,主线程才会退出
Await.result(Future.sequence(futures), Duration.Inf)

关键说明

  • delay函数:通过ScheduledExecutorService实现非阻塞延迟,只会在指定时间后触发任务,不会阻塞线程池中的工作线程。
  • Future.sequence(futures):把30个独立的Future合并成一个Future,当所有子Future都完成时,这个合并后的Future才会完成。
  • Await.result(..., Duration.Inf):让主线程一直等待,直到所有异步任务执行完毕,确保打印操作都能完成。

如果你使用Scala 2.13及以上版本,还可以用更简洁的方式实现非阻塞延迟:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scala.concurrent.duration._
import scala.concurrent.Await
import java.util.Date
import java.util.concurrent.CompletableFuture

def now(): Date = new Date()

def delay(duration: FiniteDuration): Future[Unit] = {
  Future.from(CompletableFuture.runAsync(() => (), CompletableFuture.delayedExecutor(duration.length, duration.unit)))
}

val futures = (1 to 30).map(_ => delay(2.seconds).map(_ => println(now())))

Await.result(Future.sequence(futures), Duration.Inf)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:40:25