在以下程序中main
线程调用startThread
,它在新线程上启动。它调用greet_thread
,然后在新线程上调用greet
。 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 !");
}
}
答案 0 :(得分:3)
如果你有30K线程在运行,你就会遇到问题。我怀疑你没有这么多的CPU。您可以使用VisualVM,ThreadGroup或线程池或使用计数器检查线程数。
通常在设计程序时,您知道自己需要多少个线程,并且只需要检查是否是这种情况。你不是故意用一个未知但很多线程编写一个程序,并试着找出它后来的内容,因为这个数字不是很有用。
答案 1 :(得分:0)
如果您只想计算仍处于活动状态的线程数,则更改run
方法以在共享计数器启动时递增它,并在终止时递减它(通常或通过异常)。
请注意,您需要使用类似AtomicInteger
的内容来实现计数器...或者执行某些操作来同步更新。增加原始整数不是原子的,如果没有充分同步,这可能会导致heisenbug。
(现有的count
变量也一样!)