Программа не завершается при использовании фьючерсов - PullRequest
3 голосов
/ 14 июля 2020

Я пытаюсь одновременно запустить функцию для каждого файла в каталоге. К сожалению, всякий раз, когда я использую Futures, моя программа не хочет завершаться (работает вечно). Я пробовал использовать Await.result() с тем же результатом: /

При запуске кода он работает нормально, даже «fini sh?» распечатывается и зависает ...

Вот мой код. (Я новичок в 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)
}

1 Ответ

2 голосов
/ 14 июля 2020

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)
}
...

На основе

...