2010-02-25 25 views
15

मुझे ScheduledThreadPoolExecutor होना चाहिए जो कि यदि कोई काम नहीं है, तो अंतिम धागे को रोकता है, और नए कार्य होने पर (और कुछ समय के लिए धागे को जीवित रखता है) बनाता है। लेकिन एक बार ऐसा करने के लिए कोई और काम नहीं है, तो इसे फिर से सभी धागे को त्यागना चाहिए।अनुसूचित थ्रेडपूलएक्सएटर और कोरपूलसाइज 0?

मैंने इसे new ScheduledThreadPoolExecutor(0) के रूप में बनाया है, लेकिन नतीजतन, कोई धागा कभी नहीं बनाया गया है, न ही कोई निर्धारित कार्य कभी निष्पादित किया जाता है।

क्या कोई मुझे बता सकता है कि क्या मैं ScheduledThreadpoolExecutor के आस-पास अपना स्वयं का रैपर लिखने के बिना अपना लक्ष्य प्राप्त कर सकता हूं?

अग्रिम धन्यवाद!

+1

ऐसा लगता है कि आप कुछ ऐसा चाहते हैं जो 'निष्पादक सेवा' से 'एक्जिक्यूटर्स सेवा' जैसे 'निष्पादक सेवा' से निष्पादित करता है और निष्पादित करता है। केवल यह कि आप केवल 'निष्पादक सेवा' के बजाय 'अनुसूचित कार्यवाहक सेवा' इंटरफ़ेस को लागू करना चाहते हैं। इंटरफेस। क्या यह एक सटीक सारांश है? –

+0

असल में, हाँ, यह एक सटीक सारांश है। –

उत्तर

14
असल

आप यह कर सकते हैं, लेकिन इसकी अस्पष्ट:

  • एक नया ScheduledThreadPoolExecutor
  • निर्माता धागे आप चाहते हैं
  • KeepAliveTime सेट की अधिकतम संख्या को कोर धागे सेट में बनाएं निष्पादक
  • और आखिरी में की, की अनुमति देने के कोर धागे समयबाह्य करने

    m_Executor = new ScheduledThreadPoolExecutor (16,null); 
    m_Executor.setKeepAliveTime (5, TimeUnit.SECONDS); 
    m_Executor.allowCoreThreadTimeOut (true); 
    

    यह केवल जावा 6 हालांकि

+0

बहुत धन्यवाद, जो मुझे बिल्कुल चाहिए जैसा बिल्कुल लगता है। –

7

मुझे संदेह है कि java.util.concurrent में प्रदान की गई कुछ भी आपके लिए यह नहीं करेगी, सिर्फ इसलिए कि यदि आपको अनुसूचित निष्पादन सेवा की आवश्यकता है, तो आपके पास अक्सर आवर्ती कार्य करने के लिए कार्य होते हैं। यदि आपके पास आवर्ती कार्य है, तो आमतौर पर केवल उसी धागे को रखने और कार्य के अगले पुनरावृत्ति के लिए इसका उपयोग करने के लिए अधिक समझ में आता है, बल्कि आपके धागे को फाड़ने और अगले पुनरावृत्ति में एक नया निर्माण करने के बजाय ।

बेशक, एक अनुसूचित निष्पादक का उपयोग गैर-पुनरावर्ती कार्यों के बीच देरी डालने के लिए किया जा सकता है, या इसका उपयोग उन मामलों में किया जा सकता है जहां संसाधन बहुत दुर्लभ हैं और पुनरावृत्ति इतनी कम है कि आपके सभी धागे को फाड़ना समझ में आता है नया काम आता है। इसलिए, मैं ऐसे मामलों को देख सकता हूं जहां आपका प्रस्ताव निश्चित रूप से समझ में आएगा।

इसे लागू करने के लिए, मैं Executors.newCachedThreadPool से एक कैश किए गए थ्रेड पूल को एक सिंगल-थ्रेडेड अनुसूचित एक्जिक्यूटर सेवा (यानी new ScheduledThreadPoolExecutor(1)) के साथ लपेटने का प्रयास करने पर विचार करता हूं। कार्यों को निर्धारित निष्पादक सेवा के माध्यम से निर्धारित किया जा सकता है, लेकिन निर्धारित कार्यों को इस तरह से लपेटा जाएगा कि आपके एकल-थ्रेडेड अनुसूचित निष्पादक को निष्पादित करने के बजाय, एकल-थ्रेडेड निष्पादक उन्हें वास्तविक रूप से कैश किए गए थ्रेड पूल पर सौंप देगा निष्पादन।

यह समझौता आपको अधिकतम एक थ्रेड देता है जब ऐसा करने के लिए बिल्कुल कोई काम नहीं होता है, और यह आपको बहुत से धागे देगा (आपको अपने सिस्टम की सीमाओं के भीतर) निश्चित रूप से काम करने के लिए।

+0

विस्तृत उत्तर के लिए धन्यवाद। असल में, मैं अनुसूचित संचालन के लिए अनुसूचित थ्रेडपूल का उपयोग कर रहा हूं, दोहराए गए कार्यों के लिए नहीं। और अधिकांश गतिविधियां एक बार की कार्यवाही होती हैं और मैं हर बार एक थ्रेड बनाने से नफरत करता हूं और ऐसा करने के लिए आवश्यक विभिन्न वर्गों के बीच मैन्युअल रूप से शेड्यूल्ड एक्स्सेलर सेवा को साझा करने से भी नफरत है। –

8

ThreadPoolExecutor javadocs पढ़ना सुझाव देना चाहेंगे कि एलेक्स वी के समाधान ठीक है के साथ काम करता है। हालांकि, ऐसा करने से परिणामस्वरूप अनावश्यक रूप से धागे को बना और नष्ट कर दिया जाएगा, एक कैश किए गए धागे-पूल की तरह कुछ भी नहीं। अनुसूचित थ्रेडपूल को धागे की एक चर संख्या के साथ काम करने के लिए डिज़ाइन नहीं किया गया है। स्रोत को देखते हुए, मुझे यकीन है कि जब भी आप कोई कार्य सबमिट करते हैं तो आप लगभग एक नए धागे को खत्म कर देंगे। जो के समाधान को तब भी काम करना चाहिए जब आप केवल देरी वाले कार्यों को सबमिट कर रहे हों।

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

5

यह समस्या ScheduledThreadPoolExecutor (Bug ID 7091003) में एक ज्ञात बग है और जावा 7u4 में तय की गई है। हालांकि looking at the patch, फिक्स यह है कि "CorePoolSize 0 है, भले ही कम से कम एक थ्रेड प्रारंभ हो।"

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