Scala异步处理无输出问题求助:如何实现无Thread.sleep的结果输出?
解决Scala异步Future无输出且替换Thread.sleep的方案
你的代码没输出的核心原因是:主线程启动完所有Future后直接退出了,而Future的任务是在后台线程池执行的,还没来得及打印,程序就终止了。另外,Thread.sleep是阻塞操作,会占用线程池资源,需要换成非阻塞的延迟方式。
实现步骤及代码
- 替换阻塞的Thread.sleep为非阻塞延迟:通过调度器实现非阻塞延迟,避免占用线程池线程。
- 等待所有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
相关产品推荐
相关产品推荐

