知道特定线程启动的线程数

时间:2013-04-08 13:15:59

标签: java multithreading

在以下程序中main线程调用startThread,它在新线程上启动。它调用greet_thread,然后在新线程上调用greetstartThread致电greet_thread直到count is less than or equal to 10

有什么办法可以判断当前有多少线程正在运行?更具体一点,我想通过调用greet_thread来了解当前运行的线程数。由于greet_thread被称为10 times,很明显10 threads将在最后单独运行。但有没有办法知道这个数字?

这是在程序中启动的线程的层次结构:

main_thread
  | 
 \ /
starts a new thread by calling startThread
  |
 \ /
startThread starts a new thread by calling greet_thread-->--|
  |                                                         |
 \ /                                                       \ / gets called 10 times
 greetThread is started with an infinite loop------<------- |
  |
 \ /
 greet() method is called

class Tester {

    private static  int count = 0;

    public static void main(String args[]) {
        startThread();
    }

    public static void startThread() {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                while(count <= 10) {
                    greet_thread(count);
                    count++;
                }
            }
        };
        new Thread(r).start();
    }

    public static void greet_thread(final int count) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                while(true) {
                    greet();
                }
            }
        };
        new Thread(r).start();
    }

    public static void greet() {
        System.out.println("GREET !");
    }
}

2 个答案:

答案 0 :(得分:3)

如果你有30K线程在运行,你就会遇到问题。我怀疑你没有这么多的CPU。您可以使用VisualVM,ThreadGroup或线程池或使用计数器检查线程数。

通常在设计程序时,您知道自己需要多少个线程,并且只需要检查是否是这种情况。你不是故意用一个未知但很多线程编写一个程序,并试着找出它后来的内容,因为这个数字不是很有用。

答案 1 :(得分:0)

如果您只想计算仍处于活动状态的线程数,则更改run方法以在共享计数器启动时递增它,并在终止时递减它(通常或通过异常)。

请注意,您需要使用类似AtomicInteger的内容来实现计数器...或者执行某些操作来同步更新。增加原始整数不是原子的,如果没有充分同步,这可能会导致heisenbug。

(现有的count变量也一样!)