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

时间:2019-02-20 09:41:56

标签: scala akka threadpool executorservice akka-dispatcher

我想拥有一个创建线程的固定线程池。因此,我创建了自己的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
        } 
      ////// 
    }
  }
}

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

2 个答案:

答案 0 :(得分:1)

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

对于一个调度员的用例,该调度员具有许多短命的actor,并且没有actor的运行时间大于1秒(这是默认值),则可以将设置调整为更高的值,以使执行程序保持活动状态。

答案 1 :(得分:0)

您能否粘贴主应用程序代码,当没有可用任务时,该代码会终止。

如果您要创建ActorSystem,则除非您终止该操作,否则您的应用程序将不会退出,因为它确实会创建一些使用户程序保持运行状态的用户线程。