首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建与ExecutionContext.global具有相似属性的附加ExecutionContext?

如何创建与ExecutionContext.global具有相似属性的附加ExecutionContext?
EN

Stack Overflow用户
提问于 2014-11-13 06:36:50
回答 1查看 334关注 0票数 2

据我所知,在Scala中,ExecutionContext.global不同于通常使用ExecutionContext.fromExecutor(...)创建的其他ExecutionContext对象,因为它可以使用scala.concurrent.blocking作为信号,在最初较小的线程池因长时间运行、可能受io限制的计算而阻塞时产生额外的线程。有没有办法创建另一个这样的ExecutionContext?看一下源代码,看起来ExecutionContext.global是以一种相当独特的方式创建的,它是通过对impl.ExecutionContextImpl.fromExecutor(null: Executor)的内部调用创建的,它是包私有的。

EN

回答 1

Stack Overflow用户

发布于 2014-11-13 11:50:08

所以你可以用下面的代码很容易的创建它:

代码语言:javascript
复制
  scala.concurrent.ExecutionContext.fromExecutor(null)

它将经历与ExecutionContext.global完全相同的过程。

在幕后,这只是创建了一个具有特殊ThreadFactoryForkJoinPool,用于处理scala.concurrent.blocking信号。如果你想要更多的控制,你可以创建你自己的ForkJoinPool,然后提供一个ThreadFactory来做类似scala版本所做的事情(source):

代码语言:javascript
复制
  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提供了实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26898018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档