据我所知,Akka使用多个线程为ActorSystem中的所有actor提供服务。我想以编程方式检查Akka使用的线程数。但我不想使用分析器或jConsole。
答案 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()