Executors.newFixedThreadPool
использует под капотом defaultThreadFactory
, который создает поток, не являющийся демоном
Возвращает фабрику потоков по умолчанию, используемую для создания новых потоков. Эта фабрика создает все новые потоки, используемые Executor в той же ThreadGroup ... Каждый новый поток создается как поток без демона
Поскольку это потоки, не являющиеся демонами, программа не завершается. С другой стороны, например, 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))
, где мы отмечаем daemonic = true
, поэтому следующая программа завершится в конце
implicit val execContext = scala.concurrent.ExecutionContext.Implicits.global
val futures = for (file <- filesList) yield Future {
println(file)
// theFunc(file)
}
...
На основе