संभव डुप्लिकेट:जावा थ्रेड को कैसे रोकें?
Thread
निम्नलिखित कार्य हैं
suspend()
लेकिन वे सभी बहिष्कृत कर रहे हैं।
धागे को रोकने के लिए आप क्या उपयोग करते हैं?
संभव डुप्लिकेट:जावा थ्रेड को कैसे रोकें?
Thread
निम्नलिखित कार्य हैं
suspend()
लेकिन वे सभी बहिष्कृत कर रहे हैं।
धागे को रोकने के लिए आप क्या उपयोग करते हैं?
आपको यह सुनिश्चित करना चाहिए कि जब यह माना जाता है कि यह केवल/बाहर निकलता है।
स्पष्टीकरण के लिए this देखें।
आप धागे को रोकने के लिए एक बूलियन ध्वज का उपयोग कर सकते हैं। इसके अलावा आप 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
अनुचित हैं वान यदि आप इसे इस तरह कर सकता है:
private boolean running = true;
public void stop() {
running = false;
}
public void run() {
while (running) {
//your code goes here
}
}
यह रन दे के सिर्फ एक सरल तरीका है विधि बस मर जाते हैं।
+1 रनिंग को 'अस्थिर' होना आवश्यक है अन्यथा रन() कभी नहीं रुक सकता है। –
आप उसे अपने काम को समाप्त करने के लिए विनम्रता से पूछते हैं। धागे को अच्छी तरह से व्यवहार किया जाना चाहिए और पूछे जाने पर इसे अपने काम को समाप्त करना चाहिए।
आपको Thread.interrupt()
का उपयोग करने के लिए कहने के लिए जो InterruptedException
(यदि थ्रेड इंतजार कर रहा है) में फेंक देगा या थ्रेड में ध्वज सेट करें (यदि प्रतीक्षा नहीं हो रहा है)।
धागे को InterruptException
पकड़ने पर थ्रेड को इसके काम से बाहर निकलना चाहिए या यदि यह बहुत लंबा काम करता है (नींद/प्रतीक्षा के बिना) इसे समय-समय पर जांचना चाहिए यदि इसे बाधित किया गया हो और बाहर निकलें।
आपके द्वारा उल्लिखित विधियों को बहिष्कृत किया गया है क्योंकि एक बार उपयोग किया जाता है, वे सिस्टम को अस्थिर स्थिति में ला सकते हैं: यह सिर्फ हत्या की प्रक्रिया की तरह है। इन तरीकों का उपयोग थ्रेड को कृपा से बाहर निकलने का कोई मौका नहीं देता है।
निष्कर्ष यह है कि प्रत्येक थ्रेड जिसे आप कार्यान्वित कर रहे हैं, उसके पास सुंदर निकास के लिए स्वयं का तंत्र होना चाहिए। आम तौर पर आप निम्नलिखित करते हैं। boolean
ध्वज exit
बनाएं जो डिफ़ॉल्ट रूप से false
है।
while (!exit) {
// do the job
}
जोड़ें विधि exit()
कि true
को यह झंडा बदल जाता है, इसलिए जब विधि बाहर से कहा जाता है अपने धागा अगले चरण में while
पाश छोड़ देंगे: थ्रेड run()
विधि पाश की तरह लागू करना चाहिए।बाहर निकलने पर आपको संसाधन बंद करने आदि की परवाह करनी चाहिए।
जाहिर है आप गाना
किसी भी धागा अपने काम करने के लिए चलाता है भेजकर तंत्र में सुधार कर सकते हैं। यदि ऐसा करने के लिए और अधिक काम है तो इसे स्वयं निर्धारित करना चाहिए। जब आप एक काम करने वाले थ्रेड को रोकना चाहते हैं, तो इसका मतलब है कि थ्रेड सोचता है कि काम मौजूद है, लेकिन आप नहीं चाहते कि थ्रेड इसे करे। यह निश्चित रूप से आपके डिजाइन में एक समस्या है। एक अच्छी तरह से डिज़ाइन की गई समस्या में, धागे को रोकने/फिर से शुरू करने की कोई आवश्यकता नहीं है।
आप धागे को नहीं रोकते हैं, बस 'रन' विधि को इसके निष्पादन को समाप्त करें। –
क्या आप अपने उपयोग के मामले में विस्तार से बता सकते हैं कि आप थ्रेड को क्यों रोकना चाहते हैं? – Vikdor
पूर्णता के लिए, दूसरी प्रक्रिया पूरी प्रक्रिया को समाप्त करना है - जो काम करेगा। –