2012-07-18 11 views
11

मैं Windows के माध्यम से वर्तमान में चल रहे धागेजावा में वर्तमान में चल रहे थ्रेड की संख्या को कैसे जांचें?

  1. की संख्या पहले
  2. प्रोग्राम
+2

आप प्रोग्राम मतलब है? – Keppil

+0

मैं बहु-थ्रेडिंग से निपटने के लिए नया हूं। मेरे पास एक जावा प्रोग्राम है जो 10 के साथ थ्रेड पूल का उपयोग करता है। जबकि प्रोग्राम चल रहा है, मैं कैसे जांच सकता हूं कि मेरे प्रोग्राम द्वारा वर्तमान में कितने थ्रेड चल रहे हैं? मुझे इस पल में वर्तमान में चल रहे धागे की संख्या को प्रिंट करके विंडोज़ के माध्यम से और कार्यक्रम के माध्यम से ऐसा करने का एक तरीका चाहिए। –

उत्तर

26

यह आपको दे देंगे का उपयोग करता है आपके वीएम में धागे की कुल संख्या:

int nbThreads = Thread.getAllStackTraces().keySet().size(); 

अब, यदि आप वर्तमान में सभी धागे निष्पादित करना चाहते हैं जी, आप कर सकते हैं कि:

int nbRunning = 0; 
for (Thread t : Thread.getAllStackTraces().keySet()) { 
    if (t.getState()==Thread.State.RUNNABLE) nbRunning++; 
} 

संभावित स्थितियों में यहां उनका वर्णन कर रहे हैं: Thread.State javadoc

आप धागे चल programmaticaly नहीं लेकिन एक Windows उपकरण के साथ, आप Process Explorer इस्तेमाल कर सकते हैं देखना चाहते हैं।

0

विंडोज से देखने का कोई तरीका के लिए देख रहा हूँ:

वहाँ बाध्य है एक performance counter के लिए होने के लिए प्रक्रिया जो आपको बता सकती है।

प्रोग्राम

:

वहाँ Thread#activeCount है:

वर्तमान थ्रेड धागा समूह और इसके उपसमूहों में सक्रिय धागे की संख्या का अनुमान देता है। वर्तमान धागे के धागे समूह में सभी उपसमूहों पर पुनरावर्ती रूप से पुनरावृत्त होता है।

या अधिक सीधे, ThreadGroup#activeCount:

इस सूत्र समूह और इसके उपसमूहों में सक्रिय धागे की संख्या का अनुमान देता है।

और ThreadGroup#getParent:

इस सूत्र समूह की मूल देता है।

पहला, अगर माता पिता अशक्त नहीं है, माता पिता धागा समूह के checkAccess विधि कोई तर्क के साथ कहा जाता है; इसका परिणाम एक सुरक्षा अपवाद हो सकता है।

सभी जिनमें से की तर्ज पर कुछ सुझाव देने के लिए लग रहे हैं:

int activeThreadTotalEstimate() { 
    ThreadGroup group; 
    ThreadGroup parent; 

    group = Thread.currentThread().getThreadGroup(); 
    while ((parent = group.getParent()) != null) { 
     group = parent; 
    } 
    return group.activeCount(); 
} 
5

आप सभी धागे और उनके स्टैक ट्रेस JVM में चल रहा प्राप्त कर सकते हैं Thread.getAllStackTraces()

1

अपने निम्न टिप्पणी

कोड का निम्न भाग में के जवाब में: जबकि (resultSet.next()) { नाम = resultSet.getString ("hName"); MyRunnable कर्मचारी = नया MyRunnable (hName); threadExecutor.execute (कार्यकर्ता); }। मेरा धागा पूल का आकार 10 है।मुझे यह सुनिश्चित करने की ज़रूरत है कि मेरा प्रोग्राम को बहु-थ्रेडिंग & के साथ सही ढंग से काम कर रहा है, यह जांचना है कि कितने थ्रेड एक निश्चित पल पर चल रहे हैं। मैं यह कैसे कर सकता हूँ?

एक अन्य उत्तर में, मेरा सुझाव है कि आप JVisualVM के साथ अपना कोड प्रोफाइल करें और जांचें कि आपका थ्रेड पूल काम कर रहा है या नहीं। इस सुझाव के पीछे कारण यह है कि तब आपको JVM प्रबंधन के सभी अन्य हाउसकीपिंग धागे से परेशान नहीं होना पड़ेगा। इसके अलावा आप जो करना चाहते हैं वह है कि JVisualVM जैसे टूल क्यों बनाए जाते हैं।

यदि आप जावा प्रोग्रामों को प्रोफाइल करने के लिए नए हैं, तो JVisualVM आपको यह देखने देता है कि आप अपना कोड चलाते समय हुड के नीचे क्या चलते हैं। आप हीप, जीसी गतिविधि देख सकते हैं, आपके सीपीयू या मेमोरी उपयोग को किसी भी नमूना/प्रोफाइल को चलाने/प्रतीक्षा करने वाले धागे का निरीक्षण कर सकते हैं। साथ ही कुछ प्लगइन्स भी हैं।

0

कोड स्निपेट:

import java.util.Set; 
import java.lang.Thread.State; 
public class ActiveThreads { 
    public static void main(String args[]) throws Exception{ 
     for (int i=0; i< 5; i++){ 
      Thread t = new Thread(new MyThread()); 
      t.setName("MyThread:"+i); 
      t.start(); 
     } 
     int threadCount = 0; 
     Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); 
     for (Thread t : threadSet){ 
      if (t.getThreadGroup() == Thread.currentThread().getThreadGroup() && 
       t.getState() == Thread.State.RUNNABLE){ 
       System.out.println("Thread :"+t+":"+"state:"+t.getState()); 
       ++threadCount; 
      } 
     } 
     System.out.println("Thread count started by Main thread:"+threadCount); 
    } 
} 

class MyThread implements Runnable{ 
    public void run(){ 
     try{ 
      Thread.sleep(2000); 
     }catch(Exception err){ 
      err.printStackTrace(); 
     } 
    } 
} 

उत्पादन:

Thread :Thread[main,5,main]:state:RUNNABLE 
Thread count started by Main thread:1 

स्पष्टीकरण:

Thread.getAllStackTraces().keySet() आप सभी धागे, जो दोनों Program and System द्वारा शुरू कर दिया है की सूची प्रदान करता है। ThreadeGroup की स्थिति की अनुपस्थिति में, यदि वे सक्रिय हैं तो आपको सिस्टम थ्रेड गिनती मिल जाएगी।

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer

संबंधित मुद्दे