दिलचस्प पोस्ट
सॉकेट चैनल में सीरियल की गई ऑब्जेक्ट को कैसे भेजना और प्राप्त करना मैं node.js में डिफ़ॉल्ट समयक्षेत्र कैसे सेट कर सकता हूं? फॉर्म का उपयोग किए बिना डाक चर सेट करना डीजेंगो व्यवस्थापक पेज गायब सीएसएस के साथ फाइल लिखना विफल रहता है सीएसएस के अंत में प्रश्न चिह्न में यूआरएल में क्या शामिल है? SQL सर्वर 2005 में कॉमा से अलग NVARCHAR को टेबल रिकॉर्ड्स में कैसे रूपांतरित करना है? फ़िल्टर पैरामीटर को स्केलबिटमैप बनाने के लिए क्या करता है? डीईफ़ मुख्य () का उपयोग क्यों करें? एसक्यूएल, संख्या की सहायक तालिका HTTP GET अनुरोध की अधिकतम लंबाई? Ui-router और आयन-टैब का उपयोग करते समय खाका अद्यतन नहीं होता है jQuery – हटायें शैली .css () फ़ंक्शन के साथ जोड़ा गया मैं पायथन में एक लॉग फ़ाइल कैसे पूंछ सकता हूँ? क्या रीकैपटा को टूट गया / हैक किया गया है / ओसीआरड / हार / टूटा हुआ है?

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

मेरे पास एक सरल जावा 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() को कॉल करना है, लेकिन यह सादे मूर्खतापूर्ण है।

Solutions Collecting From Web of "कैसे ठीक से बंद जावा निष्पादक सेवा"

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

 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

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