2011-12-25 23 views
8

काम नहीं करता मैं निम्नलिखित कोड में धागा समाप्त करने के लिए कोशिश कर रहा हूँ:बाधा()

public synchronized void run() { 
    try { 
     while (!Thread.currentThread().isInterrupted()) { 
      this.scan(); 
      this.distribute(); 
      this.wait(); 
     } 
    } catch (InterruptedException e) {} 
} 

public void cancel() { 
    this.interrupt(); 
} 

लेकिन धागा समाप्त नहीं होंगे। मैंने डीबगर का इस्तेमाल किया और पाया कि this.interrupt() कमांड के बाद, थ्रेड बाधित नहीं होता है (मैंने this.isInterrupted() अभिव्यक्ति पर एक घड़ी डाली है और यह false रहता है)। किसी के पास कोई विचार है कि यह धागा बाधित क्यों नहीं होगा?

संपादित करें:

समस्या पाया गया है। यह पता चला है कि इस धागे के दो उदाहरण थे।

/* (class Detector extends Thread) */ 
Detector detector = new Detector(board); 
... 
Thread tdetector = new Thread(detector); /* WRONG!!! */ 
... 
tdetector.start(); 
... 
+0

क्या होगा यदि आप –

+0

स्थिति में 'Thread.interrupted()' के साथ प्रयास करें, तो कोई स्थिर नहीं है उस नाम से वर्ग 'थ्रेड' में विधि। और इसका कोई मतलब नहीं होगा, क्योंकि यह एक तरीका है जो इस वर्ग के उदाहरण से संबंधित है। –

+0

निश्चित रूप से एक स्थिर विधि है ['Thread.interrupted()'] (http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#interrupted%28%29)। मुझे नहीं लगता कि इससे मदद मिलेगी, हालांकि, यह मूल रूप से उदाहरण विधि के समान ही काम करता है (लेकिन बाधित ध्वज को भी साफ़ करता है, जो चीजों को जटिल कर सकता है)। –

उत्तर

5

the docs के मुताबिक, अगर आप interrupt() फोन जबकि धागा एक wait() राज्य में है, बाधा ध्वज सेट नहीं किया जाएगा: मैं समस्याग्रस्त कोड है कि इस के लिए नेतृत्व संलग्न कर रहा हूँ। आपको एक बाधित अपवाद होना चाहिए, जो लूप (और धागा) से बाहर निकल जाएगा।

संपादित

मेरी टिप्पणी और आपकी प्रतिक्रिया के अनुसार, समस्या आप इन धागे के एक से अधिक चल रहा है कि है।

+0

लेकिन धागा समाप्त नहीं होता है। इस धागे के कारण पूरा कार्यक्रम समाप्त नहीं होता है। –

+1

@LeifEricson - क्या थ्रेड कुछ स्कूटर चक्र में 'स्कैन()' या 'वितरित() 'के अंदर फंस गया है? –

+0

नहीं। मैंने डीबगर का उपयोग यह पुष्टि करने के लिए किया कि यह इन तरीकों के अंदर कभी फंस नहीं जाता है। –

2

आप शायद गलत थ्रेड पर cancel पर कॉल कर रहे हैं। यदि आप इसे देखते हैं, तो यह cancel()इस धागे को रद्द करता है। आप शायद कुछ अन्य धागे को रद्द करना चाहते हैं।

यह भी सच है कि isInterrupted() करने के लिए अपने कॉल अनावश्यक है, लेकिन उस का कारण नहीं बनेगा बीच में आता है नष्ट हो ...


दूसरी ओर, cancel विधि एक की एक विधि है, तो कक्षा जो Thread फैली हुई है, तो this वह थ्रेड हो सकता है जिसे रद्द करने की आवश्यकता है। (उत्तर देने का प्रयास करने वाले लोगों के लिए समस्या यह है कि मूल प्रश्न में अपर्याप्त विस्तार है ...)

+0

'रद्द करें' एक उदाहरण विधि प्रतीत होता है, इसलिए सही थ्रेड ऑब्जेक्ट पर 'इंटरप्ट' कहा जा रहा है। उस थ्रेड पर निष्पादित करते समय विधि को निश्चित रूप से कॉल नहीं किया जाना चाहिए (जो विधि को बेकार तरीके से प्रस्तुत करेगा)। थ्रेड वास्तव में कंप्यूटिंग करते समय 'इंटरप्ट() 'को कॉल करने के लिए' अवरुद्ध()' पर कॉल आवश्यक है (जिस स्थिति में कोई इंटरप्ट किए गए अपवाद को फेंक दिया जाता है)। –

+1

नहीं। मैं इस धागे को समाप्त करना चाहता हूं। एक और थ्रेड 'रद्द करें' विधि को कॉल करता है। यही एक रास्ता है एक धागा जो तरीकों अवरुद्ध है ('प्रतीक्षा की तरह()') –

+0

लेकिन जब 'Another' धागा कॉल रद्द वह खुद को निरस्त कर रही है, तो आप नहीं समाप्त के लिए मुझे पता है। रद्द करने के लिए आपको ** ** ** धागे को संग्रहीत करने का एक तरीका ढूंढना होगा। शायद आपकी 'रन' विधि में, अपना 'थ्रेड.getCurrentThread() 'और फिर अपने' रद्द करें 'इंटरप्ट ** स्टोर करें ** थ्रेड। – OldCurmudgeon

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