पहले, मैं कहना चाहिए कि एक धागा रोक नहीं आसान है। वास्तव में, सामान्य मामले में, धागे को सुरक्षित रूप से नहीं रोका जा सकता:
आप एक धागा आप बंद करना चाहते पर Thread.interrupt()
कॉल कर सकते हैं, लेकिन कोई गारंटी नहीं है कि धागा बाधा देखेंगे नहीं है, अकेले वास्तव में जाने रूक जा।
आप बहिष्कृत Thread.stop()
विधि को कॉल कर सकते हैं, लेकिन यह विधि असुरक्षित है। यदि आप इसे दुर्भाग्यपूर्ण पल में बुलाते हैं, तो आप आधा अद्यतन राज्य में डेटा संरचनाओं को छोड़ सकते हैं, सिग्नल पर आने वाले अन्य धागे (हमेशा के लिए) छोड़ सकते हैं जो आने वाले नहीं होंगे।
यहाँ कैसे मैं विधि के निष्पादन के लिए एक निगरानी को लागू होता है।
सबसे पहले मैं वॉचडॉग सेवा में दो कॉल जोड़ने के लिए विधि को संशोधित करता हूं; जैसे
startMethod(maxTime)
now + maxTime
की समाप्ति के समय के साथ कतार में एक प्रविष्टि जोड़ना होगा: public void someMethod(...) {
Watchdog.startMethod(maxTime);
// do stuff
Watchdog.endMethod();
}
इसके बाद, मैं एक प्राथमिकता कतार समाप्ति समय पर आदेश दिया साथ निगरानी लागू होगी। प्रवेश समय-समय पर वर्तमान धागा (जब विधि बुलाया गया था के लिए एक संदर्भ भी शामिल होगा।
endMethod()
वर्तमान थ्रेड के लिए एक() कतार प्रवेश के लिए विचार करेंगे, और इसे हटाने अगर मिल गया।
- प्रहरी धागा होगा पहली कतार प्रविष्टि को देखें। अगर उस प्रविष्टि में 'अब' से कम की समाप्ति हुई थी, तो वॉचडॉग एंट्री को हटा देगा, इसके धागे को रोक देगा और अगली प्रविष्टि की जांच करेगा। अगली प्रविष्टि की समयसीमा समाप्त होने तक दोहराएं।
कुछ विचारों को डेटा संरचनाओं को दिया जाना चाहिए, और उन मामलों से निपटने की आवश्यकता है जहां endMethod
कॉल छोड़ दिए गए हैं। (वास्तव में, के बाद से एक विधि कॉल एक अपवाद के कारण समाप्त कर सकते हैं, endMethod()
कॉल वास्तव में एक finally
ब्लॉक में किया जाना चाहिए।)
ध्यान दें कि startMethod
और endMethod
कॉल (और शायद चाहिए) एक टिप्पणी के द्वारा डाला जा सकता है प्रोसेसर या ऐसा कुछ।
जटिलता को देखते हुए, और तथ्य यह है कि आप धागा (सुरक्षित रूप से) को रोकने के लिए गारंटी नहीं दे सकते, मैं कुछ समाधान है कि एक विधि प्रहरी को शामिल नहीं करता के बारे में सोच चाहते हैं।
स्रोत
2011-08-09 13:53:05
शायद पहलू करेंगे? –
"एक धागा बंद करना आसान है", नहीं, यह नहीं है। मैं समझ नहीं पा रहा हूं कि "मैं वस्तुओं के सामान्य तरीकों को कैसे सुरक्षित कर सकता हूं?", न तो उदाहरण जो अंतहीन पाश के साथ आता है। – toto2
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html उन सभी को पढ़ें, और फिर जांचें कि आप अभी भी स्टॉप() को कॉल करना चाहते हैं। शायद आपकी समस्या के आसपास काम करने के लिए प्रोवर्बियल बॉक्स के बाहर कुछ सोच आवश्यक है। – RichColours