जवाबों:
एक चलने योग्य सेट प्राप्त करने के लिए:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
ThreadGroup
इस तरह से रूट को हैंडल करें:
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parentGroup;
while ((parentGroup = rootGroup.getParent()) != null) {
rootGroup = parentGroup;
}
अब, enumerate()
फ़ंक्शन को रूट समूह पर बार-बार कॉल करें । दूसरा तर्क आपको सभी सूत्र प्राप्त करने देता है, पुनरावर्ती:
Thread[] threads = new Thread[rootGroup.activeCount()];
while (rootGroup.enumerate(threads, true ) == threads.length) {
threads = new Thread[threads.length * 2];
}
ध्यान दें कि हम सभी प्रविष्टियों को शामिल करने के लिए सरणी के बड़े होने तक बार-बार एन्यूमरेट () को कैसे कहते हैं।
rootGroup
, आपको उपयोग करना चाहिए new Thread[rootGroup.activeCount()+1]
। activeCount()
शून्य हो सकता है, और अगर यह आप एक अनंत लूप में चलेगा।
हाँ, देख लेना धागे की एक सूची प्राप्त करने । उस पेज पर बहुत सारे उदाहरण।
यह प्रोग्रामेटिक रूप से करना है। यदि आप कम से कम लिनक्स पर एक सूची चाहते हैं तो आप केवल इस कमांड का उपयोग कर सकते हैं:
kill -3 processid
और VM stdout को थ्रेड डंप करेगा।
आप ThreadMXBean से थ्रेड्स के बारे में बहुत सारी जानकारी प्राप्त कर सकते हैं ।
MB का संदर्भ प्राप्त करने के लिए स्थिर ManagementFactory.getThreadMXBean () विधि को कॉल करें ।
क्या आपने jconsole पर एक नज़र डाली है ?
यह एक विशेष जावा प्रक्रिया के लिए चलने वाले सभी थ्रेड्स को सूचीबद्ध करेगा।
आप JDK बिन फ़ोल्डर से jconsole शुरू कर सकते हैं।
आप Ctrl+Break
विंडोज में या kill pid --QUIT
लिनक्स में भेजकर सभी थ्रेड्स के लिए एक पूर्ण स्टैक ट्रेस प्राप्त कर सकते हैं ।
Apache Commons यूजर्स इस्तेमाल कर सकते हैं ThreadUtils
। वर्तमान कार्यान्वयन वॉक थ्रेड समूह दृष्टिकोण का उपयोग करता है जो पहले उल्लिखित है।
for (Thread t : ThreadUtils.getAllThreads()) {
System.out.println(t.getName() + ", " + t.isDaemon());
}
में ग्रूवी आप निजी तरीकों कॉल कर सकते हैं
// Get a snapshot of the list of all threads
Thread[] threads = Thread.getThreads()
में जावा , आपके द्वारा दी गई सुरक्षा प्रबंधक यह अनुमति देता है कि विधि का उपयोग प्रतिबिंब आह्वान कर सकते हैं।
मुख्य धागे द्वारा शुरू किए गए धागे की सूची प्राप्त करने के लिए कोड स्निपेट:
import java.util.Set;
public class ThreadSet {
public static void main(String args[]) throws Exception{
Thread.currentThread().setName("ThreadSet");
for ( int i=0; i< 3; i++){
Thread t = new Thread(new MyThread());
t.setName("MyThread:"+i);
t.start();
}
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
for ( Thread t : threadSet){
if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup()){
System.out.println("Thread :"+t+":"+"state:"+t.getState());
}
}
}
}
class MyThread implements Runnable{
public void run(){
try{
Thread.sleep(5000);
}catch(Exception err){
err.printStackTrace();
}
}
}
उत्पादन:
Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[ThreadSet,5,main]:state:RUNNABLE
यदि आपको सिस्टम थ्रेड्स सहित सभी थ्रेड्स की आवश्यकता है, जो आपके प्रोग्राम द्वारा शुरू नहीं किया गया है, तो नीचे दी गई शर्त को हटा दें।
if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())
अब आउटपुट:
Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[Reference Handler,10,system]:state:WAITING
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[ThreadSet,5,main]:state:RUNNABLE
Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[Finalizer,8,system]:state:WAITING
Thread :Thread[Signal Dispatcher,9,system]:state:RUNNABLE
Thread :Thread[Attach Listener,5,system]:state:RUNNABLE
public static void main(String[] args) {
// Walk up all the way to the root thread group
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parent;
while ((parent = rootGroup.getParent()) != null) {
rootGroup = parent;
}
listThreads(rootGroup, "");
}
// List all threads and recursively list all subgroup
public static void listThreads(ThreadGroup group, String indent) {
System.out.println(indent + "Group[" + group.getName() +
":" + group.getClass()+"]");
int nt = group.activeCount();
Thread[] threads = new Thread[nt*2 + 10]; //nt is not accurate
nt = group.enumerate(threads, false);
// List every thread in the group
for (int i=0; i<nt; i++) {
Thread t = threads[i];
System.out.println(indent + " Thread[" + t.getName()
+ ":" + t.getClass() + "]");
}
// Recursively list all subgroups
int ng = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[ng*2 + 10];
ng = group.enumerate(groups, false);
for (int i=0; i<ng; i++) {
listThreads(groups[i], indent + " ");
}
}
टर्मिनल का उपयोग करते हुए थ्रेड्स और उनके पूर्ण राज्यों की सूची प्राप्त करने के लिए, आप नीचे दिए गए कमांड का उपयोग कर सकते हैं:
jstack -l <PID>
PID आपके कंप्यूटर पर चलने वाली प्रक्रिया की id है। अपने जावा प्रक्रिया की प्रक्रिया आईडी प्राप्त करने के लिए आप बस चला सकते हैंjps
कमांड ।
इसके अलावा, आप अपने धागा डंप कि TDAs में jstack (थ्रेड डंप विश्लेषक) इस तरह के द्वारा उत्पादित विश्लेषण कर सकते हैं fastthread या Spotify धागा विश्लेषक उपकरण ।