2011-08-23 10 views
5

स्मृति और समय प्रदर्शन के लिए निष्पादकों सबसे अच्छा उपयोग के बारे में कुछ सवाल:निष्पादकों का उपयोग करें और लागत दंड

  1. वहाँ किसी भी कीमत दंड

    ExecutorService e = Executors.newSingleThreadExecutor(); 
    e.execute(callable) 
    e.shutdown() 
    

    के उपयोग के लिए किए गए है की तुलना करने के लिए:

    new Thread(runnable).start() 
    
  2. यदि Callable लंबा नहीं है, और कभी भी अधिक नहीं होगा एक उदाहरण चल रहा है (1) से कोड का उपयोग करना ठीक है? या क्या ExecutorService एक स्थिर उदाहरण के रूप में और कॉल के बीच पुन: उपयोग करना सबसे अच्छा है?

  3. यदि मेरे पास (2) में वर्णित कई कार्य हैं, तो क्या प्रत्येक कार्य के साथ अपनी स्वयं की निष्पादक सेवा रखने में कोई समस्या है या केंद्रीकृत एक बेहतर है? (मैं एक क्लाइंट एप्लिकेशन के बारे में बात कर रहा हूं जहां आम तौर पर इन कार्यों में से एक से अधिक नहीं होगा)

  4. Executor कौन से संसाधन बंद करते हैं यदि यह बंद नहीं है()?

उत्तर

6

वहाँ

ExecutorService e=Executors.newSingleThreadExecutor(); 
e.execute(callable) 
e.shutdown() 

का उपयोग करने से किसी भी कीमत दंड है की तुलना में:

new Thread(runnable).start() 

हाँ, वहाँ एक "दंड" है: ExecutorService सबसे अधिक संभावना होगा बनाने के लिए और अधिक महंगा हो क्योंकि यह आपके द्वारा सबमिट किए जा रहे कार्यों के लिए कतार भी बनाता है और यदि कोई वें पढ़ना बंद करने से पहले विफल रहता है, फिर किसी भी बाद के कार्यों को चलाने के लिए असफल थ्रेड को दूसरे के साथ बदल दिया जाएगा (इसलिए वहां काफी तर्क है)। हालांकि, आप संभवतः एक कार्य चलाने के लिए ExecutiveService बनाना नहीं चाहते हैं ... शायद यह ExecutorService (अगले प्रश्न में उस पर अधिक) का सबसे अच्छा उपयोग नहीं है।

यदि कोई कॉल करने योग्य लंबा नहीं है, और कभी भी एक से अधिक उदाहरण नहीं चल रहे हैं तो यह -1- से कोड का उपयोग करना ठीक है? या निष्पादक सेवा को स्थिर के रूप में रखना और कॉल के बीच पुन: उपयोग करना सबसे अच्छा है?

ExecutorService का सुझाव दिया उपयोग एक धागा पूल, जहां ExecutorService के आसपास रखने के रूप में है और आप जब तक आप प्रस्तुत करने के लिए कार्य किया है के रूप में यह करने के लिए प्रस्तुत करने के कार्यों को रखने के लिए। यह स्थैतिक या सिर्फ एक नियमित सदस्य हो सकता है, जो आपकी आवश्यकताओं/डिजाइन पर अप्रासंगिक और अत्यधिक निर्भर है। भले ही आप एक समय में केवल एक उदाहरण चला रहे हों (यानी आपके पास केवल एक थ्रेडेड एक्जिक्यूटर है), यह ExecutorService का उपयोग करने के लिए अभी भी अधिक कुशल है क्योंकि यह थ्रेड का पुन: उपयोग करता है, इसलिए लंबे समय तक यह बनाने से कम महंगा होगा आपके द्वारा सबमिट किए गए प्रत्येक कार्य के लिए एक नया धागा।

यदि मेरे पास कई कार्य हैं ... क्या प्रत्येक कार्य के लिए उनके कार्यकर्ता सेवा के लिए कोई समस्या है या केंद्रीकृत एक बेहतर है?

कोई समस्या नहीं है, लेकिन यह अक्षम है, इसलिए केवल एक केंद्रीकृत निष्पादक सेवा है।

यदि कोई शट डाउन नहीं है तो क्या कोई एक्जिक्यूटर्स खपत करता है?

मुझे नहीं लगता कि आप उस विशेष रूप से के बारे में चिंता है, खासकर यदि आप सही संदर्भ में Executor उपयोग कर रहे हैं यह कम से कम हो जाएगा चाहिए।

0

एक निष्पादक सेवा का बिंदु कई कार्यों को एक निश्चित संख्या में थ्रेड के बीच साझा करना है। एक कार्य चलाने के लिए एक निष्पादक सेवा बनाना अपर्याप्त ओवरहेड है।

new Thread(runnable).start() हमेशा एक्जिक्यूटर्स सेवा बनाने से तेज़ होना चाहिए क्योंकि निष्पादक सेवा केवल वैसे ही धागा बनायेगी, लेकिन इसका ट्रैक रखने के अतिरिक्त ओवरहेड के साथ।

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