scala akka - 即使演员被杀死,线程数量也会无限增长

scala akka - Number of threads grows indefinitly even when actors are killed

我正在为每个工作单元创建一个演员。每个参与者创建一个线程池。 工作完成后,它会向发件人发送消息,发件人会向儿童演员发送毒丸

我注意到 jvm 进程中的线程数仍在无限增长,即使子 actors "killed"

示例

class ParentActor (...) extends Actor {
 ....
 ....

 val childActor = props(...child actor props...)
 val resultFuture = childActor ? "do some work"
 ...
 resultFuture onComplete {
   ...
   childActor ! PoisonPill // "kill" the child actor
 }

class ChildActor(...) extends Actor {
  val executionContext: ExecutionContextExecutor = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
...

  receive {
    ...
    sender ! "done"
  }

  override def postStop() {
    println("post stop called") // the actor prints this
  }
}

actor 和它的线程不应该是 GCd 吗?

线程池不会自动进行垃圾回收。请参阅 Java ThreadPoolExecutor

的文档

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ThreadPoolExecutor.html

A pool that is no longer referenced in a program AND has no remaining threads may be reclaimed (garbage collected) without being explicitly shutdown.

但是由于您正在创建一个固定池,它永远不会有 "no remaining threads"。因此它永远不会被 JVM 收集,即使子 actor 已停止。

您可以在 postStop 中实施清理方法,调用 shutdownNow()。但是,正如 Thilo 指出的那样,管理子 actor 中的线程池非常奇怪。您没有解释为什么要这样做,但我会考虑让 Akka 管理您的线程。