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 个线程的池,该线程创建非守护线程:
未终止的非守护线程将阻止 JVM 退出。您需要提供一个创建守护线程的 ThreadFactory ,或者在您创建的 ExecutionContext 的 Executor 上手动调用 shutdown 。来自。
关于scala - 当使用 Futures 执行上下文的其他实现时,程序永远不会结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25606792/