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

标签 java multithreading playframework playframework-2.0 akka

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

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

enter image description here

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

最佳答案

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

ForkJoinPool

关于java - 为什么 Akka 保留所有这些线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35708748/

相关文章:

java - 当输入错误的类型时,如何防止 Scanner 抛出异常?

Java 方法有时会被线程之一跳过

scala - 强制Redis超时

java - 无法为 Playframework 导入 com.avaje.ebean.Model

java - 并发和异常

scala - PlayFramework:如何注入(inject)数据库对象

java - 无法在 Java 代码中打开特定的 JAR 文件

java - Quartz 调度程序不在 dropwizard 应用程序中执行 SQL 查询

java - 哪里可以找到google-api-services-youtube jar文件

python - 使用多处理并行运行 rpy2 会引发无法捕获的奇怪异常