【问题标题】:Particular Thread Count特定线程数
【发布时间】:2015-09-01 07:55:44
【问题描述】:

我想知道特定线程类有多少活动线程。 假设我有一个扩展线程的类 T。在其他一些类(例如:Demo)中,我想获取 T 类 Thread 的线程数。我知道Thread.activeCount() 方法,但它会获得线程组的计数。它不满足我的需求。假设我有扩展线程的 T1 和 T2 类,并且在 Demo 类中我想获得有多少 T2 活动线程。 我应该如何实现这一目标?有什么想法吗??

PS:我没有 T1 和 T2 类的源代码。

感谢您的帮助。

【问题讨论】:

  • 据我所知,Java 并没有为您提供执行此操作的能力。如您所述,您只能计算池中所有正在运行的线程。

标签: java multithreading thread-safety


【解决方案1】:

你可以使用Thread.enumerate():

public int countThreadsOfClass(Class<? extends Thread> clazz) {
    Thread[] tarray = new Thread[Thread.activeCount()];
    Thread.enumerate(tarray);
    int count = 0;
    for(Thread t : tarray) {
        if(clazz.isInstance(t))
            count++;
    }
    return count;
}

【讨论】:

  • 请阅读我更新的帖子。我无权访问该课程的源代码
  • @Stunner,为什么你需要访问源代码才能使用我的解决方案?
  • 感谢@Tagir Valeev 的解决方案。有用。但我在 API 中看到这一行“由于此方法固有的竞争条件,建议该方法仅用于调试和监视目的。”你能看一下这个api链接吗docs.oracle.com/javase/7/docs/api/java/lang/…我很担心这个声明,因为如果我要在生产系统中使用它。
  • @Stunner,当然,如果在执行此代码期间启动或停止某些线程,您可能会遇到竞争条件。您不会遇到崩溃,但结果可能不正确。为了使它更健壮,您可以检查Thread.enumerate 的返回值是否等于tarray.length,如果不同,则在循环的前两行中重复。这实际上是一个肮脏的解决方案,因此如果您有更好的方法,请考虑更好的方法。如果你不控制这些线程是如何创建的(可能它们是在一些写得不好的库中内部创建的),你可以使用它。
【解决方案2】:

您的Thread(或Runnable)子类可以保持static 活动计数。 run() 开始时递增,run() 结束时递减(在 finally 块中)。

确保增量/减量以多线程安全方式完成。

【讨论】:

  • 您所说的 .subclass 来自 Some API.. 没有源代码。事实上,即使我有它的源代码。 (事实上​​我有)但我不应该触摸或修改 API(我的要求)
  • 不,我无法控制启动线程...线程是在 APi 本身中启动的。
【解决方案3】:

您可以实现ThreadFactory 来构造自定义线程类并提供一个线程组实例来获取计数。通过使用 ThreadFactory,每个实例都可以包含自己的 ThreadGroup,从而可以根据所使用的工厂访问计数。

【讨论】:

    【解决方案4】:

    尝试使用ThreadPoolExecutor。 您可以扩展ThreadPoolExecutor 并通过调用getActiveCount() 来计算线程数。

    http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

    【讨论】:

      【解决方案5】:
         private static int getThreadCount(){
              int runningThread = 0;
              for (Thread t : Thread.getAllStackTraces().keySet()) if (t.getState()==Thread.State.RUNNABLE && t instanceof YourThreadClassName ) runningThread++;
              System.out.println("Active threads : "+runningThread);
              return runningThread;
          }
      

      只需将 YourThreadClassName 替换为由 Thread 扩展的类即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 1970-01-01
        • 2014-03-14
        • 1970-01-01
        • 2014-05-21
        • 1970-01-01
        • 2012-02-12
        相关资源
        最近更新 更多