据我所知,在Scala中,ExecutionContext.global不同于通常使用ExecutionContext.fromExecutor(...)创建的其他ExecutionContext对象,因为它可以使用scala.concurrent.blocking作为信号,在最初较小的线程池因长时间运行、可能受io限制的计算而阻塞时产生额外的线程。有没有办法创建另一个这样的ExecutionContext?看一下源代码,看起来ExecutionContext.global是以一种相当独特的方式创建的,它是通过对impl.ExecutionContextImpl.fromExecutor(null: Executor)的内部调用创建的,它是包私有的。
发布于 2014-11-13 11:50:08
所以你可以用下面的代码很容易的创建它:
scala.concurrent.ExecutionContext.fromExecutor(null)它将经历与ExecutionContext.global完全相同的过程。
在幕后,这只是创建了一个具有特殊ThreadFactory的ForkJoinPool,用于处理scala.concurrent.blocking信号。如果你想要更多的控制,你可以创建你自己的ForkJoinPool,然后提供一个ThreadFactory来做类似scala版本所做的事情(source):
class DefaultThreadFactory(daemonic: Boolean) extends ThreadFactory with ForkJoinPool.ForkJoinWorkerThreadFactory {
def wire[T <: Thread](thread: T): T = {
thread.setDaemon(daemonic)
thread.setUncaughtExceptionHandler(uncaughtExceptionHandler)
thread
}
def newThread(runnable: Runnable): Thread = wire(new Thread(runnable))
def newThread(fjp: ForkJoinPool): ForkJoinWorkerThread = wire(new ForkJoinWorkerThread(fjp) with BlockContext {
override def blockOn[T](thunk: =>T)(implicit permission: CanAwait): T = {
var result: T = null.asInstanceOf[T]
ForkJoinPool.managedBlock(new ForkJoinPool.ManagedBlocker {
@volatile var isdone = false
override def block(): Boolean = {
result = try thunk finally { isdone = true }
true
}
override def isReleasable = isdone
})
result
}
})
}此外,Akka还为其FJP提供了实现。
https://stackoverflow.com/questions/26898018
复制相似问题