有没有办法获得scala.concurrent.ExecutionContext.global的非全局克隆?

有没有办法获得scala.concurrent.ExecutionContext.global的非全局克隆?,scala,concurrency,threadpool,executorservice,fork-join,Scala,Concurrency,Threadpool,Executorservice,Fork Join,我正在寻找ForkJoinPool的一个非全局实例,以便获得全局实例的所有优秀默认并行性和执行语义,并能够控制池的生命周期 我浏览了scala.concurrent和scala.concurrent.impl,的源代码,不幸的是,创建默认实例的所有代码都是private[scala.concurrent],而且也没有间接的方法调用代码 我只能使用ExecutionContext.fromExecutor(null)以默认设置获取ExecutionContext的新实例,但无法获取底层ForkJo

我正在寻找
ForkJoinPool
的一个非全局实例,以便获得全局实例的所有优秀默认并行性和执行语义,并能够控制池的生命周期

我浏览了
scala.concurrent
scala.concurrent.impl,
的源代码,不幸的是,创建默认实例的所有代码都是
private[scala.concurrent]
,而且也没有间接的方法调用代码

我只能使用
ExecutionContext.fromExecutor(null)
以默认设置获取
ExecutionContext
的新实例,但无法获取底层
ForkJoinPool
。也没有办法直接关闭
ExecutionContext


我在做一些我不该做的深奥的事情吗?因为对我来说,想要它似乎是一件很自然的事情:没有全局性的东西的默认语义/配置。

私有[path.to.package]的好处是,你可以通过假装在包内来解决它:


但是,请注意,如果您这样做,您将不再处于公共API领域,并且在更改scala版本时将不得不处理某些不兼容问题。

这不是访问问题,而是形状问题。大象的尾巴:

scala> type ECI = { def createExecutorService: ExecutorService }
defined type alias ECI

scala> val fjp = ExecutionContext.global.asInstanceOf[ECI].createExecutorService
fjp: java.util.concurrent.ExecutorService = scala.concurrent.forkjoin.ForkJoinPool@606dff1[Running, parallelism = 8, size = 0, active = 0, running = 0, steals = 0, tasks = 0, submissions = 0]
或无形状:

scala> import shapeless.syntax.typeable._
import shapeless.syntax.typeable._

scala> val fjp = concurrent.ExecutionContext.global.cast[ECI] map (_.createExecutorService) getOrElse ???
fcp: java.util.concurrent.ExecutorService = scala.concurrent.forkjoin.ForkJoinPool@45c26421[Running, parallelism = 8, size = 0, active = 0, running = 0, steals = 0, tasks = 0, submissions = 0]
然后

scala> val eces = ExecutionContext fromExecutorService fjp
eces: scala.concurrent.ExecutionContextExecutorService = scala.concurrent.impl.ExecutionContextImpl$$anon$1@1df3794c

scala> eces.shutdown

好的,这是显而易见的;以前没有真正考虑过:)顺便说一下,您的代码仍然没有获得默认池本身,只有默认执行上下文,但我想我可以修改它以获得基础池。几个小时前,我也不知道这个功能,直到我看了最新的几集,Josh Suereth在其中解释了它的存在原因以及它是如何发挥可笑的作用。我不接受/提升投票,只是想看看我是否可以从中获得一些其他意见;如果不是,代表就是你的。不知道我怎么会错过那么简单的一点。。。非常感谢!:)
scala> val eces = ExecutionContext fromExecutorService fjp
eces: scala.concurrent.ExecutionContextExecutorService = scala.concurrent.impl.ExecutionContextImpl$$anon$1@1df3794c

scala> eces.shutdown