2012-02-14 20 views

उत्तर

30

ऐसा करने के लिए, execute() पर कॉल करने के बजाय आपको submit() को ExecutorService पर एक कार्य करने की आवश्यकता है। जब आप ऐसा करते हैं, तो Future वापस लौटाया जाता है जिसका उपयोग निर्धारित कार्य में हेरफेर करने के लिए किया जा सकता है। विशेष रूप से, आप वर्तमान में निष्पादित किए गए कार्य को बाधित करने के लिए Future पर cancel(true) पर कॉल कर सकते हैं (या कार्य निष्पादन को अभी तक शुरू नहीं होने पर पूरी तरह से निष्पादन छोड़ दें)।

वैसे, Executors.newSingleThreadExecutor() द्वारा लौटाई गई वस्तु वास्तव में ExecutorService है।

+2

इसके लिए काम करने के लिए, आपको मैन्युअल रूप से यह सुनिश्चित करने की ज़रूरत नहीं है कि थ्रेड बाधित है। सभी धागे बाधित नहीं हो सकते हैं। - मुझे वैसे भी लगता है। –

+2

हां, यह वर्णन करता है कि कार्य को चलाने वाले धागे को कैसे बाधित करना है। क्या कार्य व्यवधान का जवाब देता है या नहीं, यह एक अन्य प्रश्न है। यह इस बात पर निर्भर करता है कि कार्य क्या कर रहा है। – erickson

+0

@ एरिक्सन I के पास भी इसी तरह का सवाल है [यहां] (http://stackoverflow.com/questions/29159184/how-can-i-interrupt-resttemplate-call-as-soon-as-my-thread-is-interrupted) थ्रेड बाधा से संबंधित है। यदि संभव हो, तो क्या आप वहां पर मेरी मदद कर सकते हैं। मुझे अभी तक कोई प्रतिक्रिया नहीं मिली है इसलिए किसी भी मदद की सराहना की जाएगी। – john

4

निष्पादक के आंतरिक रूप से प्रबंधित थ्रेड को बाधित करने का एक और तरीका shutdownNow(..) विधि को ExecutorService पर कॉल करना है। नोट, हालांकि, @ एरिक्सन के समाधान के विपरीत, इसके परिणामस्वरूप पूरे ThreadPoolExecutor आगे के उपयोग के लिए अनुपयुक्त हो जाएंगे।

मैं इस दृष्टिकोण मामलों में जहां ExecutorService अब जरूरत है और Future उदाहरणों पर नजर रखने अन्यथा अनावश्यक है में विशेष रूप से उपयोगी है (यह जा रहा है आपके आवेदन की exit(..) विधि का एक प्रमुख उदाहरण) पाते हैं। ExecutorService#shutdownNow(..) javadocs से

प्रासंगिक जानकारी:

प्रयास सभी सक्रिय रूप से क्रियान्वित करने के कार्यों को रोकने के लिए, इंतजार कर रहे कार्यों के प्रसंस्करण रुकती है, और कार्य है कि निष्पादन का इंतजार कर रहे थे की एक सूची देता है।

सक्रिय रूप से कार्य निष्पादित करने को रोकने के सर्वोत्तम प्रयासों से परे कोई गारंटी नहीं है। उदाहरण के लिए, सामान्य कार्यान्वयन Thread.interrupt के माध्यम से रद्द हो जाएगा, इसलिए इंटरप्ट का जवाब देने में विफल होने वाला कोई भी कार्य कभी समाप्त नहीं हो सकता है।

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