Ответ 1
System.out.println( "Число активных потоков из данного потока:" + Thread.activeCount());
Это моя простая программа на 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. Мой вопрос в том, как мы можем узнать, сколько потоков создано в программе и сколько потоков работает? Есть ли такой инструмент?
System.out.println( "Число активных потоков из данного потока:" + Thread.activeCount());
Thread.getAllStackTraces()
предоставит вам карту, в которой каждый поток является ключевым. Затем вы можете проверить состояние каждого потока и проверить thread.isAlive()
.
Map<Thread, StackTraceElement[]> threads = Thread.getAllStackTraces();
Вы можете получить доступ ко всей доступной информации о потоках в вашей программе, используя: http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html
Если вам нужен только инструмент для этого, вы можете использовать jconsole, jvisualvm и другие инструменты профилирования, которые могут показать вам детали выполняемых потоков в gui.
Я использую этот метод, используя 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;
}
Вы можете получить набор запущенных потоков из класса Thread
с помощью метода getAllStackTraces()
. Итерируйте этот набор и распечатайте текущий статус с помощью 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