दिलचस्प पोस्ट
मैं क्लासपाथ में एक जावा पैकेज से सभी वर्गों को कैसे पढ़ूं? एक निश्चित वर्ण के बाद स्ट्रिंग का भाग निकालें एंड्रॉइड लाइब्रेरी प्रोजेक्ट के अंदर कस्टम व्यू विशेषताएँ के साथ सहायता कस्टम HTML5 आवश्यक फ़ील्ड सत्यापन संदेश सेट करें कनवर्ट फ़ाइल: उरी एंड्रॉइड में फाइल करने के लिए IOS में स्क्रीन की चौड़ाई और ऊंचाई कैसे प्राप्त करें? वायदा के साथ स्काला में अतुल्यकालिक IO एक नोडी सरणी में सबसे बड़ा एन तत्व ढूंढने का एक तेज़ तरीका जावा की एल संख्या (लंबी) विनिर्देश क्या मैं बैसन प्रतिस्थापन के रूप में पायथन का उपयोग कर सकता हूं? Mysql और php में मुफ्त ब्लॉकों का पता लगाना? VBA की छिपी हुई विशेषताओं मैं एक जावा को सी # कनवर्टर कहां मिल सकता हूं? क्या है? = ऑपरेटर का मतलब है? सभी दूरस्थ जीआईटी शाखाओं को स्थानीय शाखाओं के रूप में ट्रैक करें

कैसे ठीक से बंद जावा निष्पादक सेवा

मेरे पास एक सरल जावा ExecutorService जो कुछ कार्य ऑब्जेक्ट्स चलाता है ( Callable )।

 ExecutorService exec = Executors.newSingleThreadExecutor(); List<CallableTask> tasks = new ArrayList<>(); // ... create some tasks for (CallableTask task : tasks) { Future future = exec.submit(task); result = (String) future.get(timeout, TimeUnit.SECONDS); // TASKS load some classes and invoke their methods (they may create additional threads) // ... catch interruptions and timeouts } exec.shutdownNow(); 

सभी कार्य समाप्त हो जाने के बाद (या तो पूर्ण या TIMEOUT- एड), मैं निष्पादक को बंद करने की कोशिश करता हूं, लेकिन इसे बंद नहीं करना चाहिए: exec.isTerminated() = FALSE. मुझे संदेह है कि कुछ कार्य जो टाइमआउट किए गए हैं ठीक से समाप्त नहीं किए जाते हैं।

और हाँ, मुझे पता है कि निष्पादक के बंद कुछ भी गारंटी नहीं दे रहा है:

सक्रिय रूप से कार्य निष्पादन को रोकने के प्रयासों से परे कोई गारंटी नहीं है। उदाहरण के लिए, विशिष्ट कार्यान्वयन {@link थ्रेड # इंटरप्ट} के माध्यम से रद्द हो जाएंगे, इसलिए किसी भी कार्य जो इंटरप्ट पर प्रतिक्रिया देने में विफल रहता है, कभी भी समाप्त नहीं हो सकता।

मेरा प्रश्न यह है, क्या यह सुनिश्चित करने का एक तरीका है कि (कार्य) सूत्र समाप्त हो जाएंगे? मेरे सबसे अच्छे समाधान के साथ आए, मेरे कार्यक्रम के अंत में System.exit() को कॉल करना है, लेकिन यह सादे मूर्खतापूर्ण है।

वेब के समाधान से एकत्रित समाधान "कैसे ठीक से बंद जावा निष्पादक सेवा"

क्या आपके पास उन कार्यों पर नियंत्रण है? यानी आप स्वयं स्वयं बना रहे हैं? मुझे संदेह है कि उन थ्रेड अवरोधों में कहीं नज़रअंदाज़ किया जा रहा है उदा

 try { .... } catch {InterruptedException e) { // do nothing } 

जब एक बाधित कदम उठाया जाता है, तो थ्रेड पर इंटरप्ट फ़्लैग को रीसेट कर दिया जाता है, अन्यथा धागा बाहर नहीं निकलता। अधिक जानकारी के लिए यहां देखें

दुर्भाग्य से आप ऐसी लाइब्रेरी का उपयोग कर रहे हैं जो इसका पालन नहीं करता है, इस स्थिति में आप आसानी से इस पर ध्यान नहीं लगा सकते हैं। उस मामले में एक हेवीवेट विकल्प Callable करने योग्य की नौकरी करने के लिए उप प्रक्रिया को बंद करने के लिए है, और यह प्रक्रिया निकास पर सभी संसाधनों को समाप्त कर देगा हेवीवेट और संभवतः गैर-तुच्छ, लेकिन विश्वसनीय।

निष्पादक सेवा के ओरेकल दस्तावेज़ पृष्ठ से अनुशंसित तरीका:

  void shutdownAndAwaitTermination(ExecutorService pool) { pool.shutdown(); // Disable new tasks from being submitted try { // Wait a while for existing tasks to terminate if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { pool.shutdownNow(); // Cancel currently executing tasks // Wait a while for tasks to respond to being cancelled if (!pool.awaitTermination(60, TimeUnit.SECONDS)) System.err.println("Pool did not terminate"); } } catch (InterruptedException ie) { // (Re-)Cancel if current thread also interrupted pool.shutdownNow(); // Preserve interrupt status Thread.currentThread().interrupt(); } 

यदि आपका पूल बंद करने के लिए अधिक समय ले रहा है, तो आप बदल सकते हैं

 1f (!pool.awaitTermination(60, TimeUnit.SECONDS)) 

सेवा मेरे

 while (!pool.awaitTermination(60, TimeUnit.SECONDS)) 

बंद :

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

बंद करें अब :

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

awaitTermination

जब तक कि सभी कार्यों को बंद करने के अनुरोध के बाद निष्पादन पूरा नहीं किया जाता है, या समय समाप्त होने पर या मौजूदा थ्रेड बाधित हो जाता है, जो भी पहले होता है