使用 Future 时程序不会终止

nat*_*api 5 concurrency scala future file

我试图对目录中的每个文件同时运行一个函数。可悲的是,每当我使用 Futures 时,我的程序都不想终止(永远运行)。我尝试过使用Await.result()相同的结果:/

运行代码时,它执行得很好,甚至“完成?” 被打印然后挂起......

这是我的代码。(我是 Scala 新手)

val execService = Executors.newFixedThreadPool(3)
implicit val execContext = ExecutionContext.fromExecutorService(execService)

val futures = for (file <- filesList) yield Future {
   println(file)
   // theFunc(file)
}
val seq = Future.sequence(futures)
seq.onComplete {
   case Success(x) => println("finish?")
   case Failure(e) => println(e)
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*lic 7

Executors.newFixedThreadPool在幕后使用defaultThreadFactory创建非守护线程

返回用于创建新线程的默认线程工厂。该工厂在同一个 ThreadGroup 中创建 Executor 使用的所有新线程...每个新线程都创建为非守护线程

因为这些是非守护线程,所以程序不会终止。另一方面,例如scala.concurrent.ExecutionContext.Implicits.global创建守护线程

val threadFactory = new DefaultThreadFactory(daemonic = true,
                                             maxBlockers = getInt("scala.concurrent.context.maxExtraThreads", "256"),
                                             prefix = "scala-execution-context-global",
                                             uncaught = (thread: Thread, cause: Throwable) => reporter(cause))
Run Code Online (Sandbox Code Playgroud)

我们注意到daemonic = true,因此以下程序将在最后终止

implicit val execContext = scala.concurrent.ExecutionContext.Implicits.global

val futures = for (file <- filesList) yield Future {
   println(file)
   // theFunc(file)
}
...
Run Code Online (Sandbox Code Playgroud)

基于