Akka使用了多少个线程?

时间:2016-08-14 11:49:20

标签: scala akka

据我所知,Akka使用多个线程为ActorSystem中的所有actor提供服务。我想以编程方式检查Akka使用的线程数。但我不想使用分析器或jConsole。

2 个答案:

答案 0 :(得分:0)

可以从配置中进行估算,因为它通常是主机上核心数的一个因素。

确切的数字将来自引擎盖下使用的线程池。第一个问题是从调度程序获取底层池的句柄。请注意,可以有多个调度程序/执行程序。

最常见的是fork join pool。您可以在池上调用getActiveThreadCount以查找正在使用的线程数。如果正在使用java的ForkJoinPool,您可以调用getPoolSize

答案 1 :(得分:0)

您可以遍历线程组树以查找由akka创建的线程组,并获取活动线程计数。

object ThreadGroupUtils {

  def getThreadGroup: ThreadGroup = Thread.currentThread.getThreadGroup

  def findAncestor(current: ThreadGroup)(isTarget: ThreadGroup => Boolean): Option[ThreadGroup] = {
    Option(current.getParent) match {
      case None =>
        None
      case opt @ Some(parent) if isTarget(parent) =>
        opt
      case Some(parent) =>
        findAncestor(parent)(isTarget)
    }
  }

  def root = findAncestor(getThreadGroup)(_.getParent == null).get

  def main = findAncestor(getThreadGroup)(_.getName == "main").get

  def getSubGroups(parent: ThreadGroup): Seq[ThreadGroup] = {
    val subgroups = new Array[ThreadGroup](parent.activeGroupCount)
    val copied = parent.enumerate(subgroups)
    subgroups.iterator.take(copied).toSeq
  }

  def printThreadGroups(group: ThreadGroup = root, indent: String = ""): Unit = {
    val subgroups =getSubGroups(group)
    println(s"${indent}${group.getName}: ${subgroups.size} subgroups, ${group.activeCount} threads")
    subgroups.foreach(printThreadGroups(_, indent + "    "))
  }
}

ThreadGroupUtils.printThreadGroups()