2013-04-18 12 views
12

मैं ExecutorService#shutdown विधि के जावाडोक के बारे में उलझन में हूं। क्या ये विरोधाभासी बयान नहीं हैं?निष्पादक सेवा बंद करने

एक व्यवस्थित शट डाउन शुरू करता है जिसमें पहले सबमिट किए गए कार्य निष्पादित होते हैं, लेकिन कोई नया कार्य स्वीकार नहीं किया जाएगा। यह विधि निष्पादन को पूरा करने के लिए पहले सबमिट किए गए कार्यों के लिए का इंतजार नहीं करती है। ऐसा करने के लिए प्रतीक्षा करें।

यदि यह पहले से सबमिट किए गए कार्यों को व्यवस्थित रूप से बंद कर सकता है, तो यह निष्पादन को पूरा करने के लिए कैसे इंतजार नहीं कर सकता?

+0

टिप्पणी का अर्थ है कि पिछले कार्यों को त्याग दिया नहीं जाएगा। ऐसा नहीं है कि वे तुरंत निष्पादित किए जाएंगे। इसके लिए 'awaitTermination()' का उपयोग करें। –

+0

सभी कार्यों को समाप्त करने की प्रतीक्षा करने के बजाए नियमित रूप से तुरंत लौटाता है। –

उत्तर

13

इसका मतलब है कि विधि उस थ्रेड में तुरंत लौटती है जिसे आप इसे कॉल करते हैं, लेकिन जिन कार्यों को अभी तक निष्पादित नहीं किया गया है, वे अभी भी अन्य धागे में चल रहे हैं।

यदि आप चाहते हैं कि आपके प्रोग्राम को पहले से सबमिट किए गए कार्यों तक इंतजार करना पड़े, तो आपको shutdown पर कॉल करने के बाद awaitTermination पर कॉल करना होगा।

+0

बिल्कुल, यह दो चिंताओं को अलग करता है। ऐसा कुछ मामला हो सकता है जिसमें आप प्रतीक्षा किए बिना बंद करना चाहते हैं। – user1225148

+0

क्या मैं कल्पना कर सकता हूं कि इंतजार करना() को निष्पादक सेवा उदाहरण पर .join() को कॉल करने जैसा कुछ है? अगर मैं awaitTermination() को कॉल नहीं करता हूं, तो उस मामले में मुख्य थ्रेड (या कॉलर थ्रेड, सटीक होना) निष्पादक सेवा थ्रेड के साथ-साथ जारी रहता है। अगर मैं awaitTermination() को कॉल करता हूं, तो मुख्य थ्रेड निष्पादन बंद कर देगा जब तक कि एक्जिक्यूटर्स सर्विस थ्रेड नहीं किया जाता है। कृपया पुष्टि करें कि मेरी समझ सही है या नहीं? – RuntimeException

6

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

तो, सफाई से किसी भी कार्य की हत्या के बिना अपने निष्पादक बंद करने के लिए, आप क्या करेंगे:

executor.shutdown(); 
executor.awaitTermination(long timeout, TimeUnit unit); 

वैकल्पिक रूप से, अगर आप सिर्फ जितनी जल्दी संभव हो अपने निष्पादक रोकना चाहते हैं, shutdownNow() का उपयोग करें।

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