तब तक थ्रेड को समाप्त करना असंभव है जब तक उस थ्रेड में चलने वाला कोड जांचता है और समाप्त करने की अनुमति देता है।
आप ने कहा, "दुर्भाग्य से मैं मारना चाहिए/उसे पुन: प्रारंभ ... मैं धागे की और मेरी स्थिति के लिए सामग्री पर पूरा नियंत्रण नहीं है यह एक पुनः आरंभ करने की आवश्यकता है"
थ्रेड की सामग्री हैं इसके निष्कर्ष को समाप्त करने की अनुमति नहीं देता है तो आप उस धागे को समाप्त नहीं कर सकते हैं।
अपनी पोस्ट में आप ने कहा: "मेरे पहले प्रयास ExecutorService साथ था, लेकिन मैं एक तरह से पता लगाने के लिए यह एक काम जब मैं .shutdownnow का उपयोग() ... पुनः आरंभ करने के लिए प्रतीत नहीं कर सकते।"
आप तो "शटडाउन" के स्रोत को देखें, यह अभी चल रहा है और वर्तमान में चल रहे धागे को बाधित करता है।यह उनके निष्पादन को तब तक नहीं रोकेगा जब तक कि उन धागे में कोड यह देखने के लिए जांच नहीं करता है कि यह निष्क्रिय है या नहीं, और यदि ऐसा है, तो निष्पादन स्वयं रोकता है। तो शटडाउनो शायद आप जो सोचते हैं वह नहीं कर रहा है।
myExecutor.execute(new Runnable() {
public void run() {
while (true) {
System.out.println("running");
}
}
});
myExecutor.shutdownnow();
कि धागा हमेशा के लिए चलना जारी रहेगा, भले ही shutdownnow बुलाया गया था, क्योंकि:
मुझे उदाहरण देकर स्पष्ट करना है कि मैं क्या मतलब है जब मैं कहता हूँ कि थ्रेड की सामग्री के लिए कि धागा समाप्त किया जा करने की अनुमति चाहिए चलो यह कभी भी यह देखने के लिए जांच नहीं करता है कि इसे समाप्त कर दिया गया है या नहीं। देखने के लिए किया जाए या नहीं यह बाधित कर दिया गया/बंद/समाप्त
myExecutor.execute(new Runnable() {
public void run() {
while (!Thread.interrupted()) {
System.out.println("running");
}
}
});
myExecutor.shutdownnow();
चूंकि यह धागा चेक: यह धागा, हालांकि, बंद हो जाएगा।
तो यदि आप एक धागा चाहते हैं जिसे आप बंद कर सकते हैं, तो आपको यह सुनिश्चित करना होगा कि यह जांचने के लिए जांच की गई है कि यह बाधित है या नहीं। यदि आप एक धागा चाहते हैं जिसे आप "बंद करें" और "पुनरारंभ" कर सकते हैं तो आप एक रननेबल बना सकते हैं जो पहले बताए गए नए कार्यों को ले सकता है।
आप एक चल रहे धागे को क्यों बंद नहीं कर सकते? खैर मैं वास्तव में झूठ बोला, आप "yourThread.stop()" पर कॉल कर सकते हैं, लेकिन यह एक बुरा विचार क्यों है? धागा एक सिंक्रनाइज़ (या अन्य महत्वपूर्ण खंड में हो सकता है, लेकिन जब हम इसे रोकते हैं तो कोड के अनुभाग) हम सिंक्रनाइज़ किए गए कुंजी शब्द द्वारा संरक्षित सेटों पर खुद को सीमित कर देंगे। सिंक ब्लॉक को उनके एंटीरिटी में निष्पादित किया जाना चाहिए और कुछ अन्य थ्रेड द्वारा एक्सेस किए जाने से पहले केवल एक थ्रेड द्वारा निष्पादित किया जाना चाहिए। यदि आप एक सिंच ब्लॉक के बीच में धागा रोकते हैं, तो सिंच ब्लॉक द्वारा रखी गई सुरक्षा को अमान्य कर दिया गया है और आपका प्रोग्राम अज्ञात स्थिति में जाएगा। डेवलपर्स चीजों को सिंक में रखने के लिए सिंक ब्लॉक में सामान डालते हैं, अगर आप थ्रेडइनस्टेंस.स्टॉप() का उपयोग करते हैं तो आप सिंक्रनाइज़ करने के अर्थ को नष्ट कर देते हैं, उस कोड का डेवलपर क्या करने की कोशिश कर रहा था और उस कोड के डेवलपर ने अपने सिंक्रनाइज़ किए गए ब्लॉक की अपेक्षा कैसे की पेश आ।
इस प्रश्न के लिए आप यह भी देख सकते हैं: http://stackoverflow.com/questions/22937592/resume-interrupted-thread – artiethenoble