【问题标题】:Why does Akka leave all these threads parked?为什么 Akka 会保留所有这些线程?
【发布时间】:2016-06-13 00:50:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: java multithreading playframework playframework-2.0 akka


    【解决方案1】:

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

    ForkJoinPool

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2017-06-24
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多