我正在使用Akka并行执行一堆非常短的任务。我使用system.actorOf
创建了一个父Actor,使用context().actorOf
创建了25个其他Actors。然后我在父Actor中调用context().stop(getSelf())
,这应该会阻止所有孩子。
我正在观察VisualVM中的线程状态以了解Akka如何在后台运行,我注意到当我在父Actor上调用stop()
时,Akka生成的线程开始慢慢被杀死在不同的时间一个接一个,其余的都停在那里。在所有线程被杀死之前10分钟,但是在我调用stop()
之后不久就出现了一个快照,在那里你可以看到默认调度程序中的一些线程被杀死但是大多数线程被停放:
为什么这些线程不会同时全部被杀?为什么他们会一次一个地被杀死?为什么让他们停在他们身边呢?似乎我创建的其他参与者没有重用这些线程。
答案 0 :(得分:3)
默认调度程序使用Java的ForkJoinPool。这将根据需要添加线程来运行作业,然后如果它们闲置一段时间则逐渐关闭它们。在API中无法保证空闲线程能够存活多长时间,因此这取决于实现。如果要更明确地处理线程数,可以使用不同类型的池,例如固定线程。