【问题标题】:How to know how many threads have been created and running?如何知道已经创建并运行了多少线程?
【发布时间】:2012-04-01 09:28:20
【问题描述】:

这是我用 Java 编写的简单程序:

public class Counter extends Thread {

    public static void main(String args[]) {    
        Thread t1 = new Thread();
        Thread t2 = new Thread();
        t1.start();
        t2.start();
    }
}

我使用的是 32 位 Windows 操作系统。我的问题是,我们如何才能知道程序中创建了多少个线程以及运行了多少个线程?有没有这样的工具?

【问题讨论】:

标签: java multithreading


【解决方案1】:

System.out.println("给定线程的活跃线程数:" + Thread.activeCount());

【讨论】:

  • 注意activeCount()只给你本地线程组中的线程数,但是JVM中有多个线程组。
  • @Bohemian 这个“多线程组”的解决方案是什么?
【解决方案2】:

Thread.getAllStackTraces() 会给你一张地图,其中每个线程都是关键。然后您可以检查每个线程的状态并检查thread.isAlive()

Map<Thread, StackTraceElement[]> threads = Thread.getAllStackTraces();

【讨论】:

    【解决方案3】:

    您可以使用以下方式访问有关程序中线程的所有可用信息: http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

    如果您只需要一个工具,您可以使用 jconsole、jvisualvm 和其他可以在 gui 中显示正在运行线程的详细信息的分析工具。

    【讨论】:

      【解决方案4】:

      如果你想要线程本身,我使用 ThreadMXBean 的这个方法:

       /**
       * Return an array with all current threads.
       * @return  Thread[] - array of current Threads
       */
      Thread[] getAllThreads(){
          final ThreadGroup root = getRootThreadGroup();
          final ThreadMXBean thbean = ManagementFactory.getThreadMXBean();
          int nAlloc = thbean.getThreadCount();
          int n=0;
          Thread[] threads;
          do{
              nAlloc *=2;
              threads = new Thread[nAlloc];
              n=root.enumerate(threads, true);
      
          }while(n==nAlloc);
          return java.util.Arrays.copyOf(threads, n);
      }
      
      /**
       * Get current ThreadGroup.
       * @see getAllThreads()
       * @return
       */
      ThreadGroup getRootThreadGroup(){
          ThreadGroup tg = Thread.currentThread().getThreadGroup();
          ThreadGroup ptg;
          while ((ptg=tg.getParent())!=null){
              tg = ptg;
          }
          return tg;
      }
      

      【讨论】:

        【解决方案5】:

        您可以使用getAllStackTraces() 方法从Thread 类中获取一组正在运行的线程。使用getState() API 迭代该设置并打印当前状态。

        示例代码:

        import java.util.Set;
        
        public class ThreadSet {
            public static void main(String args[]){
                Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
                for ( Thread t : threadSet){
                    System.out.println("Thread :"+t+":"+"state:"+t.getState());
                }
            }
        
        }
        

        如果您希望只有调用 main 的线程会在输出中列出,您会感到惊讶。

        输出:

        java ThreadSet
        
        Thread :Thread[Finalizer,8,system]:state:WAITING
        Thread :Thread[main,5,main]:state:RUNNABLE
        Thread :Thread[Reference Handler,10,system]:state:WAITING
        Thread :Thread[Signal Dispatcher,9,system]:state:RUNNABLE
        Thread :Thread[Attach Listener,5,system]:state:RUNNABLE
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-10
          • 1970-01-01
          • 2010-11-06
          • 1970-01-01
          • 2015-05-12
          • 1970-01-01
          相关资源
          最近更新 更多