为什么 Akka 保留所有这些线程?

Why does Akka leave all these threads parked?

我正在使用 Akka 并行执行一系列非常短的任务。我使用 system.actorOf 创建了一个 parent Actor,它使用 context().actorOf 创建了 25 个其他 Actor。然后我在 parent Actor 中调用 context().stop(getSelf()),这应该会停止所有 children.

我正在观察 VisualVM 中的线程状态以了解 Akka 如何在后台工作,我注意到当我在 parent Actor 上调用 stop() 时,线程产生了由 Akka 开始慢慢地在不同的时间被一个接一个地杀死,其余的则保持停放状态。在所有线程被杀死前 10 分钟,但这是我调用 stop() 后不久的快照,您可以在其中看到默认调度程序中的一些线程被杀死,但大多数线程仍处于停放状态:

为什么这些线程不会同时被杀死?为什么它们会看似任意地一次被杀死?为什么让他们中的任何一个停放?我创建的其他演员似乎没有重用这些线程。

默认调度程序使用 Java 的 ForkJoinPool。这将根据需要向 运行 作业添加线程,然后在它们空闲一段时间后逐渐关闭它们。 API 中无法保证空闲线程将存活多长时间,因此取决于实现。如果您想更明确地处理线程数,您可以使用不同类型的池,例如固定线程。

ForkJoinPool