当使用期货的执行上下文的其他实现时,程序永远不会结束

时间:2014-09-01 13:18:44

标签: scala concurrency threadpool future

import java.util.concurrent.Executors

import scala.concurrent._
import scala.util.{Failure, Success}
import scala.concurrent.duration.DurationInt
import scala.language.postfixOps

object Test extends App {

  println("start")

  implicit val ec: ExecutionContextExecutorService = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(10))

  val future: Future[Unit] = Future {
    println(s"future")
    Thread.sleep(1000)
  }

  future.onComplete({
    case Success(x) => println("Success")
    case Failure(x) => println("Failure")
  })

  Await.result(future, 10 seconds)

  println("finish")

}

,输出是:

start
future
finish
Success

......但程序永远不会结束

这种情况正在发生,因为我正在使用其他执行上下文实现,当我使用scala.concurrent.ExecutionContext.Implicits.global时,一切都很好。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

程序未关闭的原因是ExecutionContext初始化的方式:

ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(10))

这将通过defaultThreadFactory创建一个包含10个线程的池,它创建非守护程序线程:

  

Each new thread is created as a non-daemon thread

未终止的非守护程序线程将阻止JVM退出。您需要提供创建守护线程的ThreadFactory,或者在您创建shutdown的{​​{1}}上手动调用Executor