为什么 Akka 在没有任务时关闭调度程序?

Why Akka shutdowns dispatcher, when there is no tasks?

我想要固定线程池,其中包含一次创建的线程。所以,我创建了自己的 ExecutorServiceConfigurator:

class FixedThreadPoolExecutorServiceConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends ExecutorServiceConfigurator(config, prerequisites) {

  class ThreadPoolExecutorServiceFactory extends ExecutorServiceFactory {
    def createExecutorService: ExecutorService = {
      Executors.newFixedThreadPool(40)
    }
  }

  private val executor = new ThreadPoolExecutorServiceFactory()

  override def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory = {
    executor
  }
}

并使用它:

blocking-dispatcher {
  type = Dispatcher
  executor = "abc.FixedThreadPoolExecutorServiceConfigurator"
  throughput = 1

  thread-pool-executor {
    fixed-pool-size = 60
  }
}

但是每次,当我的程序没有任何任务时,Akka 都会关闭 ExecutorService:

akka.dispatch.MessageDispatcher:

private val shutdownAction = new Runnable {
  @tailrec
  final def run(): Unit = {
    shutdownSchedule match {
      case SCHEDULED ⇒
        try {
          if (inhabitants == 0) shutdown() //Warning, racy
        } 
      ////// 
    }
  }
}

我无法理解这种行为。我认为,创建线程是一项昂贵的操作。

你能粘贴你的主应用程序代码吗,当没有任务可用时,它会被终止。

如果您正在创建 ActorSystem,那么除非您终止它,否则您的应用程序将不会退出,因为它确实创建了一些用户线程,使您的应用程序保持 运行.

它不会在 运行 没有任务时停止执行程序。只有当该调度程序的最后一个 actor 停止并且超时已过(shutdown-timeout 在调度程序配置上)并且没有启动分配给调度程序的新 actor 时,才会关闭 运行。

对于调度器的用例,它有许多短命的演员和没有演员的时期 运行ning > 1 秒,这是默认值,您可以将设置调整到更高的值以保持执行者还活着。