我想有一个固定的线程池,一旦创建线程。所以,我自己创造 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都会关闭服务:
akka.dispatch.message调度程序:
private val shutdownAction = new Runnable {
@tailrec
final def run(): Unit = {
shutdownSchedule match {
case SCHEDULED ⇒
try {
if (inhabitants == 0) shutdown() //Warning, racy
}
//////
}
}
}
我不能理解这种行为。我认为,创建线程是一项昂贵的操作。
2条答案
按热度按时间wfsdck301#
当执行器的任务用完时,它不会停止执行器。只有当调度程序的最后一个参与者停止并且超时时,才会运行关闭(
shutdown-timeout
在dispatcher配置中,没有为dispatcher分配新的参与者。对于一个分派器有许多短命的参与者并且没有参与者运行的时间段大于1秒(这是默认值)的用例,您可以潜在地将设置调整到一个更高的值以保持执行器的活动。
e0bqpujr2#
你可以粘贴你的主应用程序代码,当没有任务可用时,它会被终止。
如果您正在创建
ActorSystem
然后除非你终止它,否则你的应用程序将不会退出,因为它确实创建了一些用户线程来保持你的应用程序运行。