2013-08-14 7 views
7

द्वारा एक धागा प्राप्त करें मैंने जेएमएक्स जावा में काम किया है और मुझे इंटरफेस ThreadMXBean की getAllThreadIds() विधि का उपयोग कर सभी थ्रेड आईडी प्राप्त हैं, लेकिन मुझे किसी दिए गए आईडी के धागे को मारने का एक तरीका चाहिए। उदाहरण के लिए :आईडी

ThreadMXBean tbean; 
    tbean = ManagementFactory.getThreadMXBean(); 
    long[] IDs=tbean.getAllThreadIds(); 
    //.... i need a way to kill the Threads wich have this IDs 

plz मेरी मदद धन्यवाद

उत्तर

2

वास्तव में जावा में एक धागा को मारने के लिए कोई अच्छा तरीका है। Thread.stop() नामक एक एपीआई होता था लेकिन यह भी deperecated है। अधिक जानकारी के लिए इस लिंक को देखें क्यों थ्रेड.स्टॉप खराब था और हमें थ्रेड को कैसे रोकना चाहिए।

http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

सिर्फ धागा आईडी हो रही है आप में मदद नहीं करेगा, तो आप उस धागे को रोकने के लिए एक ध्वज सेट करने के लिए धागा ऑब्जेक्ट संदर्भ की आवश्यकता है। सभी सूत्र, कुंजी के द्वारा तो पार नक्शा प्राप्त और उचित धागा खोजने के लिए

static Map<Thread,StackTraceElement[]> getAllStackTraces() 

:

2

आप इस विधि का उपयोग कर सकते हैं।

लेकिन यह एक बहुत ही खराब दृष्टिकोण है। आप धागे को रोकने के लिए कैसे जा रहे हैं? void stop() विधि का उपयोग कर? आईडी बाधा तंत्र के संयोजन के साथ निष्पादक ढांचे का उपयोग करने का सुझाव देते हैं।

2

Thread.getAllStackTraces सभी लाइव धागे के सभी स्टैक निशान लौटाता है Map<Thread,StackTraceElement[]>. ये थ्रेडएमएक्सबीन रिटर्न के समान धागे होने चाहिए। आप इस मानचित्र से धागे निकाल सकते हैं और उन्हें बाधित कर सकते हैं। ध्यान दें कि थ्रेड को मारने के लिए जावा में कोई कानूनी विधि नहीं है।

8

आप इस कोशिश कर सकते हैं:

public void printAllThreadIds() { 
    Thread currentThread = Thread.currentThread(); 
    ThreadGroup threadGroup = getRootThreadGroup(currentThread); 
    int allActiveThreads = threadGroup.activeCount(); 
    Thread[] allThreads = new Thread[allActiveThreads]; 
    threadGroup.enumerate(allThreads); 

    for (int i = 0; i < allThreads.length; i++) { 
     Thread thread = allThreads[i]; 
     long id = thread.getId(); 
     System.out.println(id); 
    } 
} 

private static ThreadGroup getRootThreadGroup(Thread thread) { 
    ThreadGroup rootGroup = thread.getThreadGroup(); 
    while (true) { 
     ThreadGroup parentGroup = rootGroup.getParent(); 
     if (parentGroup == null) { 
      break; 
     } 
     rootGroup = parentGroup; 
    } 
    return rootGroup; 
} 

लेकिन अगर आप एक Thread और नहीं stop बीच में होना चाहिए यह।

Thread.stop() विधि बहिष्कृत है, क्योंकि यह तुरंत Thread को मारता है। इस प्रकार डेटा संरचनाएं जो वर्तमान में Thread द्वारा बदली गई हैं, एक असंगत स्थिति में रह सकती हैं। बाधा थ्रेड को शानदार ढंग से बंद करने का मौका देती है।