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

标签 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时我正在使用其他执行上下文实现一切都很好。

我错过了什么?

最佳答案

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

ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(10))

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

Each new thread is created as a non-daemon thread

未终止的非守护线程将阻止 JVM 退出。您需要提供一个创建守护线程的 ThreadFactory ,或者在您创建的 ExecutionContext 的 Executor 上手动调用 shutdown 。来自。

关于scala - 当使用 Futures 执行上下文的其他实现时,程序永远不会结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25606792/

相关文章:

PHP并发HTTP请求?

java - 多个volatile变量之间的同步

c++ - 线程池的计时测试 : single thread vs callback tp vs future tp

scala - 如何将解析器与不同类型的 Elem 结合使用

java - 如何模拟构造函数竞争条件?

java - 嵌套 Scala Future 是否需要托管阻塞?

tomcat - 为什么 Tomcat 的线程比后台线程成本更高?

scala - Akka 执行上下文与 Future 全局上下文

scala - 如何连接到 Pivotal HD(来自 Spark)?

java - Scala 的 .type 和 Java 的 .class 字面量