2012-03-29 7 views
10

मैं अपने आवेदन में अनुसूचितExecutorService का उपयोग करता हूं। मुझे नियत थ्रेड चलाने के लिए समय-समय पर उपयोगिता वर्ग में इसका उपयोग करने की आवश्यकता है।अनुसूचितExecutorService: जब शटडाउन का आह्वान किया जाना चाहिए?

क्या यह स्थिर क्षेत्र में अनुसूचितExecutorService पकड़ने के लिए एक अच्छा डिज़ाइन है? क्या इस तरह के मामले में ScheduledExecutorService.shutdown() को आमंत्रित करना आवश्यक है? अगर मैं शटडाउन का आह्वान नहीं करता तो जोखिम क्या है?

है यही कारण है कि मैं क्या करने के लिए सोचा क्या:

private static ScheduledExecutorService exec = Executors.newScheduledThreadPool(5); 

public void scheduleTask(String name) { 
     Future<?> future = futuresMapping.get(name); 
     if(future!=null && !future.isDone()) 
      future.cancel(true); 

     //execute once 
     Future<?> f = scheduledExecutor.schedule(new MyTask()), 1, TimeUnit.MINUTES); 
     futuresMapping.put(name, f); 
} 

धन्यवाद

उत्तर

5

आपको हमेशा शटडाउन() या शट डाउन नोव() का आह्वान करना चाहिए। यदि आप ऐसा नहीं करते हैं तो आपका एप्लिकेशन कभी समाप्त नहीं हो सकता है क्योंकि अभी भी थ्रेड सक्रिय हैं (इस पर निर्भर करता है कि आप अपने ऐप को कैसे समाप्त कर रहे हैं, भले ही यह प्रबंधित वातावरण में हो या नहीं)।

आमतौर पर आप किसी प्रकार की लाइफसाइक्ल इवेंट विधि से शटडाउन() को कॉल करेंगे - जैसे कि स्प्रिंग्स डिस्पोजेबल बीन डैस्ट्रॉय() से, या यदि आप किसी भी फ्रेमवर्क का उपयोग नहीं कर रहे हैं तो बस इसे अपने ऐप से बाहर निकलने से पहले कॉल करें।

+0

मैंने schedExecutor.shutdownNow() जोड़ने की कोशिश की; मेरे ServletContextListener में, लेकिन मुझे टॉमकैट लॉग में एक त्रुटि मिली है, "वेब एप्लिकेशन [/ servlet] ने [टाइमर -0] नामक धागा शुरू किया है, लेकिन इसे रोकने में विफल रहा है। यह मेमोरी रिसाव बनाने की संभावना है। "। मैं इस त्रुटि से कैसे बच सकता हूं? मदद के लिए धन्यवाद – lili

+0

शटडाउन अब() गैर अवरोधक कॉल है जो तुरंत वापस आ जाएगा। आपको इसके बाद awaitTermination() को कॉल करना चाहिए जो वास्तव में थ्रेड पूल तक अवरुद्ध हो जाएगा। – maximdim

+0

मैंने कोशिश की, यह काम नहीं किया। क्या मुझे 30 सेकंड से अधिक समय तक इंतजार करना चाहिए? मैंने http://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnow धन्यवाद में अधिक जानकारी लिखी – lili

3

प्रभावी जावा 2 एड का कहना है:

और यहाँ कैसे शान से समाप्त करने के लिए निष्पादक बताने के लिए है (यदि आप ऐसा करने में विफल, यह संभव है कि आपका वीएम बाहर नहीं निकलेगा):

executor.shutdown();

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