我正在使用 Akka 并行执行一系列非常短的任务。我使用 system.actorOf
创建了一个父 Actor,它使用 context().actorOf
创建了 25 个其他 Actor。然后我在父 Actor 中调用 context().stop(getSelf())
,这应该会停止所有子 Actor。
我正在观察 VisualVM 中的线程状态以了解 Akka 如何在后台工作,我注意到当我在父 Actor 上调用 stop()
时,由Akka 开始慢慢地在不同的时间被一个接一个地杀死,其余的则停在原地。在所有线程被杀死前 10 分钟,但这是我调用 stop()
后不久的快照,您可以在其中看到默认调度程序中的一些线程被杀死,但大多数线程仍处于停放状态:
为什么这些线程不会同时被杀死?为什么它们会看似任意地一次一个被杀死?为什么让他们中的任何一个停放?我创建的其他 actor 似乎没有重用这些线程。
最佳答案
默认调度程序使用 Java 的 ForkJoinPool。这将根据需要添加线程来运行作业,然后在它们空闲一段时间后逐渐关闭它们。 API 中无法保证空闲线程将存活多长时间,因此取决于实现。如果您想更明确地处理线程数,您可以使用不同类型的池,例如固定线程。
关于java - 为什么 Akka 保留所有这些线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35708748/