2012-10-10 38 views
22

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

private static ExecutorService pool = Executors.newFixedThreadPool(8); 

सभी जबकि नीचे shuting जो मुझे निम्न त्रुटि देता है बिलाव में चल रहा है:

appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak. 

मुझे पता है मैं बिल्ला नीचे shuting से पहले बंद ExecutorService करने की आवश्यकता है। सोम्स एसओ थ्रेड पहले से ही इस बारे में बात करता है लेकिन मुझे इसे संभालने का एक साफ तरीका नहीं मिला।

क्या मुझे Graceful shutdown of threads and executor में टिम-बेंडर के सुझाव के रूप में ShutdownHook का उपयोग करना चाहिए? या मैं इसके बजाय एक कैशड थ्रेडपूल का उपयोग करना चाहिए?

उत्तर

25

शटडाउन हुक बिलाव में एक अच्छा दृष्टिकोण है क्योंकि नहीं है:

  • यह पूल (शटडाउन होने पर) बहुत देर हो चुकी बंद हो जाएगा, बिलाव पहले से ही नहीं बंद कर दिया संसाधनों के बारे में आपको चेतावनी देगा

  • आप वास्तव में एप्लिकेशन को बेरोजगार होने पर उस पूल को बंद करना चाहते हैं ताकि पुनर्वितरण कार्य करता है (अन्यथा प्रत्येक एप्लिकेशन नया पूल बनाएगा और वे सभी केवल पूर्ण शटडाउन पर बंद हो जाएंगे)

  • धागे को बंद करना पूल कुछ समय (देखें नीचे) ले सकता है, बंद हुक के रूप में तेजी से संभव

के रूप में बहुत बेहतर जगह ServletContextListener.contextDestroyed() है होना चाहिए। याद रखें कि आपको shutdownNow() पूल (नए कार्यों को चलाने और अस्वीकार करने के लिए) और awaitTermination() दोनों को पहले से चलने वाले कार्यों को समाप्त करने और सभी धागे को रोकने के लिए प्रतीक्षा करना है।

+1

सटीक रूप से मुझे –

7

क्या टोमाज़ सुझाव के अलावा आप भी CachedThreadPool

धागे है कि साठ सेकंड के लिए इस्तेमाल नहीं किया गया समाप्त और कैश से निकाल रहे हैं का उपयोग कर सकते हैं। इस प्रकार, एक पूल है कि काफी लंबे समय तक निष्क्रिय बने रहने के लिए किसी भी संसाधनों

का उपभोग नहीं होगा तो एक बहुत अच्छा समाधान ServletContextListener.contextDestroyed() में CachedThreadPool और यह बंद का उपयोग किया जाएगा।

+4

+1 को जानने के लिए 5K –

+0

@ नंदकुमारटेकेल धन्यवाद। अच्छा लग रहा है :) –