2012-10-21 25 views
5

संभव डुप्लिकेट:जावा थ्रेड को कैसे रोकें?

Thread निम्नलिखित कार्य हैं

  • suspend()
  • लेकिन वे सभी बहिष्कृत कर रहे हैं।
    धागे को रोकने के लिए आप क्या उपयोग करते हैं?

    +0

    आप धागे को नहीं रोकते हैं, बस 'रन' विधि को इसके निष्पादन को समाप्त करें। –

    +0

    क्या आप अपने उपयोग के मामले में विस्तार से बता सकते हैं कि आप थ्रेड को क्यों रोकना चाहते हैं? – Vikdor

    +0

    पूर्णता के लिए, दूसरी प्रक्रिया पूरी प्रक्रिया को समाप्त करना है - जो काम करेगा। –

    उत्तर

    4

    आपको यह सुनिश्चित करना चाहिए कि जब यह माना जाता है कि यह केवल/बाहर निकलता है।

    स्पष्टीकरण के लिए this देखें।

    3

    आप धागे को रोकने के लिए एक बूलियन ध्वज का उपयोग कर सकते हैं। इसके अलावा आप Thread.isInterrupted() का उपयोग यह जांचने के लिए कर सकते हैं कि थ्रेड बाधित हो गया था और बूलियन ध्वज के समान काम को अनदेखा कर सकता है।

    class Worker implements Runnable { 
        private volatile boolean shouldRun = true; 
    
        @Override 
        public void run() { 
         while (shouldRun) { 
          // your code here 
         } 
        } 
    
        public void cancel() 
        { 
         shouldRun = false; 
        } 
    } 
    

    आप को पता है क्यों इन कार्यों आप जाँच कर सकते हैं Java Thread Primitive Deprecation

    2

    अनुचित हैं वान यदि आप इसे इस तरह कर सकता है:

    private boolean running = true; 
    
    public void stop() { 
        running = false; 
    }  
    
    public void run() { 
        while (running) { 
         //your code goes here 
        } 
    } 
    

    यह रन दे के सिर्फ एक सरल तरीका है विधि बस मर जाते हैं।

    +1

    +1 रनिंग को 'अस्थिर' होना आवश्यक है अन्यथा रन() कभी नहीं रुक सकता है। –

    2

    आप उसे अपने काम को समाप्त करने के लिए विनम्रता से पूछते हैं। धागे को अच्छी तरह से व्यवहार किया जाना चाहिए और पूछे जाने पर इसे अपने काम को समाप्त करना चाहिए।

    आपको Thread.interrupt() का उपयोग करने के लिए कहने के लिए जो InterruptedException (यदि थ्रेड इंतजार कर रहा है) में फेंक देगा या थ्रेड में ध्वज सेट करें (यदि प्रतीक्षा नहीं हो रहा है)।

    धागे को InterruptException पकड़ने पर थ्रेड को इसके काम से बाहर निकलना चाहिए या यदि यह बहुत लंबा काम करता है (नींद/प्रतीक्षा के बिना) इसे समय-समय पर जांचना चाहिए यदि इसे बाधित किया गया हो और बाहर निकलें।

    0

    आपके द्वारा उल्लिखित विधियों को बहिष्कृत किया गया है क्योंकि एक बार उपयोग किया जाता है, वे सिस्टम को अस्थिर स्थिति में ला सकते हैं: यह सिर्फ हत्या की प्रक्रिया की तरह है। इन तरीकों का उपयोग थ्रेड को कृपा से बाहर निकलने का कोई मौका नहीं देता है।

    निष्कर्ष यह है कि प्रत्येक थ्रेड जिसे आप कार्यान्वित कर रहे हैं, उसके पास सुंदर निकास के लिए स्वयं का तंत्र होना चाहिए। आम तौर पर आप निम्नलिखित करते हैं। boolean ध्वज exit बनाएं जो डिफ़ॉल्ट रूप से false है।

    while (!exit) { 
        // do the job 
    } 
    

    जोड़ें विधि exit() कि true को यह झंडा बदल जाता है, इसलिए जब विधि बाहर से कहा जाता है अपने धागा अगले चरण में while पाश छोड़ देंगे: थ्रेड run() विधि पाश की तरह लागू करना चाहिए।बाहर निकलने पर आपको संसाधन बंद करने आदि की परवाह करनी चाहिए।

    जाहिर है आप गाना

    0

    किसी भी धागा अपने काम करने के लिए चलाता है भेजकर तंत्र में सुधार कर सकते हैं। यदि ऐसा करने के लिए और अधिक काम है तो इसे स्वयं निर्धारित करना चाहिए। जब आप एक काम करने वाले थ्रेड को रोकना चाहते हैं, तो इसका मतलब है कि थ्रेड सोचता है कि काम मौजूद है, लेकिन आप नहीं चाहते कि थ्रेड इसे करे। यह निश्चित रूप से आपके डिजाइन में एक समस्या है। एक अच्छी तरह से डिज़ाइन की गई समस्या में, धागे को रोकने/फिर से शुरू करने की कोई आवश्यकता नहीं है।

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