बहु-थ्रेडेड एप्लिकेशन विकसित करते समय, हमें आमतौर पर थ्रेड्स के काम को व्यवस्थित करना चाहिए। हमारा एप्लिकेशन जितना बड़ा होगा और मल्टीथ्रेडेड कार्यों के लिए हमें जितने अधिक थ्रेड्स की आवश्यकता होगी, उतना ही अधिक होगाचलने योग्यहम जो वस्तुएं बनाते हैं।

यहां यह ध्यान दिया जाना चाहिए कि जावा में थ्रेड बनाना एक महंगा ऑपरेशन है। यदि हम ऑपरेशन करने के लिए हर बार थ्रेड का एक नया उदाहरण बनाते हैं, तो हमें प्रदर्शन के साथ बड़ी समस्याएँ मिलेंगी और परिणामस्वरूप, एप्लिकेशन के स्वास्थ्य के साथ।

एक थ्रेड पूल और थ्रेडपूल एक्ज़ीक्यूटर यहाँ हमारी सहायता के लिए आते हैं।

एक थ्रेड पूल प्री-इनिशियलाइज़्ड थ्रेड्स का एक सेट है। इसका आकार निश्चित या परिवर्तनशील हो सकता है।

यदि थ्रेड्स से अधिक कार्य हैं, तो कार्य कतार में प्रतीक्षा करते हैं। पूल में Nth थ्रेड कतार से एक कार्य लेता है, और इसके पूरा होने के बाद, थ्रेड कतार से एक नया कार्य चुनता है। एक बार कतार में सभी कार्य निष्पादित हो जाने के बाद, थ्रेड सक्रिय रहते हैं और नए कार्यों की प्रतीक्षा करते हैं। जब नए कार्य दिखाई देते हैं, तो थ्रेड्स उन्हें भी निष्पादित करना शुरू कर देते हैं।

थ्रेडपूल एक्ज़ीक्यूटर

जावा 5 से शुरू होकर, एक्ज़ीक्यूटर फ्रेमवर्क ने एक मल्टीथ्रेडिंग समाधान प्राप्त किया। सामान्य तौर पर, इसमें बहुत सारे घटक होते हैं और इसका उद्देश्य कतारों और थ्रेड पूलों को प्रभावी ढंग से प्रबंधित करने में हमारी मदद करना है।

मुख्य इंटरफ़ेस एक्ज़ीक्यूटर और एक्ज़ीक्यूटर सर्विस हैं ।

एक्ज़ीक्यूटर एक एकल शून्य निष्पादन (रननेबल रननेबल) विधि वाला एक इंटरफ़ेस है।

इस पद्धति के कार्यान्वयन के लिए किसी कार्य को पारित करते समय, यह जान लें कि इसे भविष्य में अतुल्यकालिक रूप से निष्पादित किया जाएगा।

एक्ज़ीक्यूटर सर्विस — एक इंटरफ़ेस जो एक्ज़ीक्यूटर इंटरफ़ेस का विस्तार करता है, कार्यों को निष्पादित करने की क्षमता जोड़ता है। इसमें चल रहे कार्य को बाधित करने और थ्रेड पूल को समाप्त करने के तरीके भी हैं।

थ्रेडपूल एक्ज़ीक्यूटर एक्ज़ीक्यूटर और एक्ज़ीक्यूटर सर्विस इंटरफ़ेस को लागू करता हैऔर कार्य निर्माण को कार्य निष्पादन से अलग करता है। हमें रननेबल ऑब्जेक्ट्स को लागू करने और उन्हें निष्पादक को भेजने की आवश्यकता है। थ्रेडपूल एक्ज़ीक्यूटर तब कार्यों को निष्पादित करने और थ्रेड्स के साथ काम करने और काम करने के लिए जिम्मेदार होता है।

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

थ्रेडपूल एक्ज़ीक्यूटर में 4 कंस्ट्रक्टर हैं:


ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory, 
RejectedExecutionHandler handler)
    

थ्रेडपूल एक्ज़ीक्यूटर कंस्ट्रक्टर में निम्नलिखित पैरामीटर हैं:

corePoolSize यह पैरामीटर इंगित करता है कि निष्पादक सेवा शुरू होने पर कितने धागे तैयार (शुरू) होंगे।
maxPoolSize निष्पादक सेवा द्वारा बनाए जा सकने वाले थ्रेड्स की अधिकतम संख्या।
कीपअलाइवटाइम यदि धागे की संख्या से अधिक है तो नष्ट होने से पहले एक मुक्त धागा जीवित रहेगाcorePoolSize. समय इकाइयों को अगले पैरामीटर में निर्दिष्ट किया गया है।
इकाई समय इकाइयाँ (घंटे, मिनट, सेकंड, मिलीसेकंड, आदि)।
काम कतार कार्यों के लिए एक कतार का कार्यान्वयन।
हैंडलर कार्यों के लिए हैंडलर जिन्हें पूरा नहीं किया जा सकता है।
थ्रेडफैक्टरी एक वस्तु जो मांग पर नए सूत्र बनाती है। थ्रेड फैक्ट्रियों का उपयोग एक नए थ्रेड हार्डवेयर को स्वतंत्र रूप से कॉल करता है, जिससे अनुप्रयोगों को विशेष थ्रेड उपवर्गों, प्राथमिकताओं आदि का उपयोग करने की अनुमति मिलती है।

एक थ्रेडपूल एक्ज़ीक्यूटर बनाना

निष्पादक उपयोगिता वर्ग थ्रेडपूल एक्ज़ीक्यूटर के निर्माण को आसान बना सकता है । इस उपयोगिता वर्ग के तरीके हमें तैयार करने में मदद करते हैंथ्रेडपूल एक्ज़ीक्यूटरवस्तु।

newFixedThreadPool - एक थ्रेड पूल बनाता है जो किसी भी कार्य को निष्पादित करने के लिए निश्चित संख्या में थ्रेड्स का पुन: उपयोग करता है।

ExecutorService executor = Executors.newFixedThreadPool(10);
                    
newWorkStealingPool — एक थ्रेड पूल बनाता है जहाँ थ्रेड्स की संख्या JVM के लिए उपलब्ध प्रोसेसर कोर की संख्या के बराबर होती है। डिफ़ॉल्ट समवर्ती स्तर एक है। इसका मतलब यह है कि पूल में उतने ही थ्रेड्स बनाए जाएंगे जितने जेवीएम में सीपीयू कोर उपलब्ध हैं। यदि समवर्ती स्तर 4 है, तो कोर की संख्या के बजाय उत्तीर्ण मान का उपयोग किया जाता है।

ExecutorService executor = Executors.newWorkStealingPool(4);
                    
newSingleThreadExecutor - सभी कार्यों को निष्पादित करने के लिए एक एकल थ्रेड के साथ एक पूल बनाता है।

ExecutorService executor = Executors.newSingleThreadExecutor();
                    
newCachedThreadPool - एक थ्रेड पूल बनाता है जो आवश्यकतानुसार नए थ्रेड्स बनाता है, लेकिन उपलब्ध होने पर पहले बनाए गए थ्रेड्स का पुन: उपयोग करता है।

ExecutorService executor = Executors.newCachedThreadPool();
                    
newScheduledThreadPool - एक थ्रेड पूल बनाता है जो किसी दिए गए विलंब या समय-समय पर कमांड को निष्पादित करने के लिए शेड्यूल कर सकता है।

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
                    

हम निम्नलिखित पाठों में प्रत्येक प्रकार के पूल पर विचार करेंगे।