7

मैंने कई अनुप्रयोगों में मल्टीथ्रेडिंग का उपयोग किया है। और पढ़ने के दौरान मैं ThreadPoolExecutors भर गया। मैं दोनों परिदृश्य के बीच अंतर नहीं कर सका।मल्टी थ्रेडिंग बनाम ThreadPoolExecutor

फिर भी मुझे समझ में आता है कि जब मैं एक कार्य करता हूं तो मुझे बहु-कार्य का उपयोग करना चाहिए, मैं एक कार्य को सीपीयू का उपयोग करने और काम को तेज करने के लिए कई छोटे कार्यों में विभाजित करना चाहता हूं। और ThreadPoolExecutor का उपयोग करें जब मेरे पास कार्य करने के लिए एक सेट हो और प्रत्येक कार्य एक दूसरे से स्वतंत्र हो सके।

अगर मैं गलत हूं तो कृपया मुझे सही करें। धन्यवाद

+1

मेरी समझ है कि रूप में अच्छी तरह। ** स्वतंत्र ** थ्रेड और ** विभाजित/जीत ** दृष्टिकोण के लिए मल्टीथ्रेड के लिए ThreadPoolExecutor का उपयोग करें – gtgaxiola

उत्तर

17

ThreadPoolExecutor केवल एक उच्च स्तरीय एपीआई है जो आपको निम्न स्तर थ्रेड एपीआई से निपटने के दौरान कई धागे में कार्यों को चलाने में सक्षम बनाता है। तो यह वास्तव में multithreading और ThreadPoolExecutor के बीच अंतर करने के लिए समझ में नहीं आता है।

ThreadPoolExecutor एस के कई स्वाद हैं, लेकिन उनमें से अधिकतर समानांतर में एक से अधिक थ्रेड चलाने की अनुमति देते हैं। आमतौर पर, आप Executor Service का उपयोग करेंगे और Executors फैक्ट्री का उपयोग करेंगे।

उदाहरण के लिए, ExecutorService executor = Executors.newFixedThreadPool(10); आपके द्वारा 10 धागे में सबमिट किए गए कार्यों को चलाएगा।

1

ThreadPoolExecutor मल्टीथ्रेडिंग का एक रूप है, सीधे एक थ्रेड का उपयोग करने के बजाय उपयोग करने के लिए एक सरल एपीआई के साथ, जहां आप वास्तव में कार्य सबमिट करते हैं। हालांकि, कार्य अन्य कार्यों को सबमिट कर सकते हैं, इसलिए उन्हें स्वतंत्र होने की आवश्यकता नहीं है। उप-कार्यों में कार्यों के विभाजन के लिए, आप जेडीके 7 में नए फोर्क/एपीआई एपीआई के बारे में सोच रहे हैं।

6

थ्रेड पूल (एक्जिक्यूटर्स) मल्टीथ्रेडिंग का एक रूप है, विशेष रूप से एकल निर्माता - एकाधिक उपभोक्ता पैटर्न का कार्यान्वयन, जिसमें एक थ्रेड बार-बार कार्यकर्ता धागे की एक टीम के निष्पादन के लिए कतार में काम करता है। इसे नियमित धागे का उपयोग करके कार्यान्वित किया जाता है और कई लाभ लाता है:

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

उपर्युक्त को देखते हुए, यह सच है कि पूल आमतौर पर कार्यों के लिए उपयुक्त होते हैं जो आम तौर पर एक-दूसरे से स्वतंत्र होते हैं और आमतौर पर अल्पकालिक (लंबे आई/ओ ऑपरेशन पूल से धागे को बांध देंगे जो नहीं करेंगे अन्य कार्यों को करने में सक्षम हो)।

9

ThreadPoolExecutor मल्टीथ्रेडिंग करने का एक तरीका है। यह आम तौर पर प्रयोग किया जाता है जब आप

  1. स्वतंत्र कार्य है कि समन्वय की आवश्यकता नहीं है (हालांकि कुछ भी नहीं आप समन्वय करने से रोकता है, लेकिन आप सावधान रहना होगा)
  2. की क्षमता को सीमित करना चाहते हैं कि कितने आपरेशन आप ' एक बार में निष्पादन कर रहे हैं, और (वैकल्पिक रूप से) निष्पादन के लिए ऑपरेशन कतार करना चाहते हैं यदि पूल वर्तमान में सभी धागे में काम कर रहा है।

जावा 7 में ForkJoinPool नामक कक्षा में एक और निर्मित है जिसका उपयोग आम तौर पर मानचित्र-घटा प्रकार के संचालन के लिए किया जाता है। उदाहरण के लिए, कोई फोरकोइनपूल का उपयोग करके प्रत्येक फोर्क पॉइंट पर 1/2 में सरणी को विभाजित करके, परिणाम की प्रतीक्षा कर, और परिणामों को एक साथ विलय करके एक मर्ज सॉर्ट को कार्यान्वित करने की कल्पना कर सकता है।

1

ThreadPoolExecutor

/* 
 
* <p>Thread pools address two different problems: they usually 
 
* provide improved performance when executing large numbers of 
 
* asynchronous tasks, due to reduced per-task invocation overhead, 
 
* and they provide a means of bounding and managing the resources, 
 
* including threads, consumed when executing a collection of tasks. 
 
* Each {@code ThreadPoolExecutor} also maintains some basic 
 
* statistics, such as the number of completed tasks. 
 
* 
 
* <p>To be useful across a wide range of contexts, this class 
 
* provides many adjustable parameters and extensibility 
 
* hooks. However, programmers are urged to use the more convenient 
 
* {@link Executors} factory methods {@link 
 
* Executors#newCachedThreadPool} (unbounded thread pool, with 
 
* automatic thread reclamation), {@link Executors#newFixedThreadPool} 
 
* (fixed size thread pool) and {@link 
 
* Executors#newSingleThreadExecutor} (single background thread), that 
 
* preconfigure settings for the most common usage 
 
* scenarios. 
 
*/

ThreadPoolExecutor के स्रोत कोड प्रलेखन से संगामिति को प्राप्त करने का एक तरीका है। समवर्तीता प्राप्त करने में कई तरीके हैं:

Executors ढांचा अलग-अलग एपीआई प्रदान करता है। कुछ महत्वपूर्ण एपीआई नीचे सूचीबद्ध हैं।

static ExecutorService newFixedThreadPool(int nThreads) 

एक धागा पूल कि धागे एक साझा असीम कतार बंद ऑपरेटिंग की एक निश्चित संख्या पुनः उपयोग कर लेता बनाता है।

static ExecutorService newCachedThreadPool() 

एक थ्रेड पूल है कि नए सूत्र रूप में की जरूरत बनाता है बनाता है, लेकिन पहले से निर्माण धागे का पुन: उपयोग होगा, जब वे उपलब्ध हैं।

static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 

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

static ExecutorService newWorkStealingPool() 

एक काम चोरी थ्रेड पूल अपने लक्ष्य समानांतरवाद स्तर के रूप में सभी उपलब्ध प्रोसेसर का उपयोग कर बनाता है।

एसई सवालों के नीचे पर एक नज़र डालें:

java Fork/Join pool, ExecutorService and CountDownLatch

How to properly use Java Executor?

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