我想拥有一个创建线程的固定线程池。因此,我创建了自己的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
}
//////
}
}
}
我无法理解这种行为。我认为创建线程是昂贵的操作。
答案 0 :(得分:1)
当执行器用完任务时,它不会停止执行器。仅当该调度程序的最后一个actor停止并且经过超时(在调度程序配置上为shutdown-timeout
)且没有启动分配给该调度程序的新actor时,才会运行关闭。
对于一个调度员的用例,该调度员具有许多短命的actor,并且没有actor的运行时间大于1秒(这是默认值),则可以将设置调整为更高的值,以使执行程序保持活动状态。
答案 1 :(得分:0)
您能否粘贴主应用程序代码,当没有可用任务时,该代码会终止。
如果您要创建ActorSystem
,则除非您终止该操作,否则您的应用程序将不会退出,因为它确实会创建一些使用户程序保持运行状态的用户线程。