2013-08-25 2 views
18

क्याशट डाउन और प्रतीक्षा करें टर्मिनेशन जो पहले कॉल में कोई फर्क पड़ता है?

ExecutorService eService = Executors.newFixedThreadPool(2); 
eService.execute(new TestThread6()); 
eService.execute(new TestThread6()); 
eService.execute(new TestThread6()); 
eService.awaitTermination(1, TimeUnit.NANOSECONDS); 
eService.shutdown(); 

और

eService.shutdown(); 
eService.awaitTermination(1, TimeUnit.NANOSECONDS); 

के बीच अंतर मैं सच में समझ में नहीं आता shutdown() है। यह विधि पहले सबमिट किए गए कार्यों को निष्पादन को पूरा करने के लिए प्रतीक्षा नहीं करती है। क्या इसका मतलब है shutdown() सबमिट किए गए कार्यों को समाप्त कर सकता है, लेकिन पूरा नहीं हुआ? मैंने कुछ उदाहरणों की कोशिश की, वे इसे साबित नहीं करते हैं, कृपया मुझे एक उदाहरण दें।

+0

का वास्तविक उपयोग पता लगा सकते हैं: https://stackoverflow.com/questions/36644043/how-to-properly-shutdown-java-executorservice/36644320#36644320 –

उत्तर

25

आपको पहले shutdown पर कॉल करना चाहिए। अन्यथा, आप बहुत लंबे समय तक इंतजार कर रहे हैं, क्योंकि awaitTermination वास्तव में आपके निष्पादक को बंद नहीं करता है।

यदि आप निष्पादक को बंद करने की प्रतीक्षा करने के बजाय कार्यों को पूरा करने की प्रतीक्षा करना चाहते हैं, तो आपको invokeAll का उपयोग करना चाहिए।

+0

धन्यवाद, लेकिन बहुत लंबे समय तक इंतज़ार क्यों कर रहे हैं? क्या आप मुझे व्याख्या करने के लिए कुछ उदाहरण दे सकते हैं? –

+0

@ user2245634 'awaitTermination' वास्तव में आपके निष्पादक को पहले बंद नहीं करता है। तो जब तक कोई अन्य धागा निष्पादक को बंद नहीं करता है, तब तक 'प्रतीक्षा करें' समय समाप्त होने तक बस वहां बैठेगा। जाहिर है, आपके उदाहरण में, आप समय से पहले केवल 1 नैनोसेकंद का इंतजार कर रहे थे, यही कारण है कि आपने "बहुत लंबा समय" नहीं देखा। –

+0

धन्यवाद, मैं समझता हूं, और शटडाउन() api में: यह विधि पहले सबमिट किए गए कार्यों को निष्पादन को पूरा करने के लिए प्रतीक्षा नहीं करती है। इसका मतलब है कि हो सकता है कि शटडाउन() उस कार्य को समाप्त कर सकता है जो सबमिट किया गया है, लेकिन पूरा नहीं हुआ है? लेकिन मैं कुछ उदाहरणों को आजमाने की कोशिश नहीं करता –

1

हम पहला कार्य शुरू करने के बाद ThreadPoolExecutor एक थ्रेड शुरू कर देगा जो कार्य समाप्त होने के बाद भी समाप्त नहीं होगा। कम से कम यह एक निश्चित थ्रेड पूल के लिए सच है। यही कारण है कि हमें शटडाउन कॉल करने की आवश्यकता है। शटडाउन के बाद ThreadPoolExecutor किसी भी नए कार्य को अस्वीकार कर देगा लेकिन काम खत्म करने के लिए इंतजार करेगा और फिर थ्रेड को समाप्त करने की अनुमति देगा। यही कारण है कि हमें shutdwon के बाद इंतजार की आवश्यकता है।

13

shutdown का मतलब है कि निष्पादक सेवा में कोई और आने वाला कार्य नहीं होता है।

awaitTermination शट डाउन अनुरोध के बाद बुलाया जाता है।

आपको पहले सेवा बंद करने की आवश्यकता है और फिर ब्लॉक को समाप्त करने के लिए अवरुद्ध करें और प्रतीक्षा करें।

यदि आप सभी धागे को चलाने के लिए देखना चाहते हैं और awaiTermination का उपयोग करने पर जोर देते हैं, तो आपको टाइमआउट पैरामीटर को काफी बड़ा होने की आवश्यकता है। तो अगर आप कर सकता है:

eService.shutdown(); 
if (!eService.awaitTermination(60000, TimeUnit.SECONDS)) 
    System.err.println("Threads didn't finish in 60000 seconds!"); 
} 

वैकल्पिक रूप से, तुम कर सकते हो:

eService.shutdown(); 
while (!eService.isTerminated()) { 

} 

इस तरह से आप सुनिश्चित करने के लिए सूत्र चल रहा जब तक कि वे अप्रत्याशित रूप से बाधित कर रहे हैं पूरा कर लें कर सकते हैं।

+2

आप शायद मिलीसेकंड का मतलब है ... 60000s 16.666 घंटे है। –

+11

दूसरे कोड स्निपेट की तरह व्यस्त-प्रतीक्षा न करें। बस। मत करो। – Alexander

27

पढ़ना प्रलेखन हमेशा मदद करता है:

shutdownNow:

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

यह विधि कार्यों को सक्रिय रूप से निष्पादित करने के लिए सक्रिय रूप से निष्पादित करने की प्रतीक्षा नहीं करता है। ऐसा करने के लिए प्रतीक्षा करें।

सक्रिय रूप से कार्य निष्पादित करने को रोकने के सर्वोत्तम प्रयासों से परे कोई गारंटी नहीं है। यह कार्यान्वयन थ्रेड के माध्यम से कार्यों को रद्द करता है।बीच में(), इसलिए किसी भी कार्य है कि विफल रहता है व्यवधान को समाप्त नहीं कर सकते जवाब करने के लिए

बंद:

एक व्यवस्थित शटडाउन जिसमें पहले सबमिट कार्यों मार डाला शुरुआत करता है, लेकिन कोई नया कार्य स्वीकार किए जाएंगे। आमंत्रण में अतिरिक्त प्रभाव होने पर अतिरिक्त प्रभाव नहीं है।

यह विधि 0 सबमिट किए गए कार्यों को निष्पादन को पूरा करने के लिए प्रतीक्षा नहीं करती है। ऐसा करने के लिए awaitTermination का उपयोग करें।

awaitTermination:

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

+0

मुझे शटडाउन के लिए प्रलेखन को समझ में नहीं आता है। यह पहले कहता है "पहले सबमिट किए गए कार्यों को निष्पादित किया जाता है" और फिर यह कहता है "यह विधि पहले सबमिट किए गए कार्यों को निष्पादन को पूरा करने के लिए प्रतीक्षा नहीं करती है।" तो, क्या मेरे कार्य पूरा होने के लिए चलेंगे या नहीं? – jrahhali

+5

@jrahhali इसका मतलब है विधि कॉल रिटर्न तुरंत। अर्थात। थ्रेड जो 'शटडाउन' कहता है वह ब्लॉक नहीं करता है। –

+0

आह, ब्लॉक नहीं करता है। यह अब समझ में आता है। उन्हें प्रतीक्षा करने के बजाए उस शब्द का इस्तेमाल करना चाहिए था। धन्यवाद। – jrahhali

0

प्रतीक्षा के बाद आपको shutdownNow() विधि को कॉल करने की आवश्यकता है() विधि कॉल हुआ। फिर केवल आप awaitTermination() विधि

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