3

在以下程序中,main线程调用在新线程上startThread开始。它调用greet_threadgreet在新线程上调用。startThread调用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 !");
    }
}
4

2 回答 2

3

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

通常当你设计一个程序时,你就知道你想要多少个线程,你只需要检查就是这样。您不会刻意编写具有未知但非常多线程的程序,并尝试稍后弄清楚它是什么,因为这个数字不会很有用。

于 2013-04-08T13:28:03.383 回答
0

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

请注意,您将需要使用类似的东西AtomicInteger来实现计数器......或者做一些事情来同步更新。递增原始整数不是原子的,如果没有充分同步,这可能会导致 heisenbugs。

(对于您现有的count变量也是如此!)

于 2013-04-08T14:22:28.907 回答