मल्टी-थ्रेडेड ऍप्लिकेशन विकसित करताना, आम्हाला सहसा थ्रेड्सचे कार्य आयोजित करणे आवश्यक आहे. आमचा ऍप्लिकेशन जितका मोठा असेल आणि मल्टीथ्रेड केलेल्या कार्यांसाठी आम्हाला जितके जास्त थ्रेड आवश्यक असतील तितके जास्तधावण्यायोग्यआपण तयार केलेल्या वस्तू.

येथे हे लक्षात घेतले पाहिजे की जावामध्ये थ्रेड तयार करणे हे एक महाग ऑपरेशन आहे. ऑपरेशन करण्यासाठी आम्ही प्रत्येक वेळी थ्रेडचे नवीन उदाहरण तयार केल्यास, आम्हाला कार्यक्षमतेसह आणि परिणामी, अनुप्रयोगाच्या आरोग्यासह मोठ्या समस्या येतील.

एक थ्रेड पूल आणि ThreadPoolExecutor येथे आमच्या मदतीला येतात.

थ्रेड पूल हा प्री-इनिशियल थ्रेडचा संच असतो. त्याचा आकार निश्चित किंवा परिवर्तनीय असू शकतो.

थ्रेडपेक्षा जास्त टास्क असल्यास टास्क रांगेत थांबतात. पूलमधील Nth थ्रेड रांगेतून एक कार्य घेतो, आणि ते पूर्ण झाल्यानंतर, थ्रेड रांगेतून एक नवीन कार्य उचलतो. रांगेतील सर्व कार्ये पूर्ण झाल्यानंतर, थ्रेड सक्रिय राहतात आणि नवीन कार्यांची प्रतीक्षा करतात. जेव्हा नवीन कार्ये दिसतात, तेव्हा थ्रेड्स ते कार्यान्वित करण्यास सुरवात करतात.

ThreadPoolExecutor

Java 5 सह प्रारंभ करून, एक्झिक्युटर फ्रेमवर्कने मल्टीथ्रेडिंग सोल्यूशन मिळवले. सर्वसाधारणपणे, त्यात बरेच घटक असतात आणि त्याचा उद्देश आम्हाला रांग आणि थ्रेड पूल कार्यक्षमपणे व्यवस्थापित करण्यात मदत करणे हा आहे.

मुख्य इंटरफेस एक्झिक्युटर आणि एक्झिक्युटर सर्व्हिस आहेत .

एक्झिक्युटर हा सिंगल व्हॉइड एक्झिक्यूट (रननेबल रननेबल) पद्धतीचा इंटरफेस आहे.

या पद्धतीच्या अंमलबजावणीसाठी एखादे कार्य पास करताना, ते भविष्यात असिंक्रोनसपणे कार्यान्वित केले जाईल हे जाणून घ्या.

ExecutorService — एक इंटरफेस जो एक्झिक्युटर इंटरफेसचा विस्तार करतो, कार्ये कार्यान्वित करण्यासाठी क्षमता जोडतो. चालू कार्यात व्यत्यय आणण्यासाठी आणि थ्रेड पूल संपुष्टात आणण्याच्या पद्धती देखील यात आहेत.

ThreadPoolExecutor एक्झिक्युटर आणि एक्झिक्युटर सर्व्हिस इंटरफेस लागू करतोआणि टास्क एक्झिक्युशनपासून टास्क क्रिएशन वेगळे करतो. आम्हाला रन करण्यायोग्य ऑब्जेक्ट्स अंमलात आणणे आवश्यक आहे आणि त्यांना एक्झिक्युटरकडे पाठवणे आवश्यक आहे. ThreadPoolExecutorनंतर कार्ये कार्यान्वित करण्यासाठी आणि थ्रेड तयार करण्यासाठी आणि कार्य करण्यासाठी जबाबदार आहे .

कार्य अंमलबजावणीसाठी पाठविल्यानंतर, पूलमधील विद्यमान थ्रेड वापरला जातो. यामुळे कामगिरी सुधारते. हे नवीन धागा तयार करण्यासाठी आणि सुरू करण्यासाठी संसाधने वाया घालवण्याच्या समस्येचे निराकरण करते आणि पुन्हा एकदा आम्ही थ्रेड पूर्ण केल्यानंतर कचरा गोळा करणे.

ThreadPoolExecutor मध्ये 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)
    

ThreadPoolExecutor कन्स्ट्रक्टरमध्ये खालील पॅरामीटर्स आहेत :

corePoolSize हे पॅरामीटर सूचित करते की एक्झिक्युटर सेवा सुरू झाल्यावर किती थ्रेड्स तयार (सुरू) होतील.
कमाल पूल आकार एक्झिक्युटर सेवा तयार करू शकणार्‍या थ्रेडची कमाल संख्या.
KeepAliveTime थ्रेड्सची संख्या जास्त असल्यास नष्ट होण्याआधी मोकळा केलेला धागा जिवंत राहील तो काळcorePoolSize. पुढील पॅरामीटरमध्ये वेळ युनिट्स निर्दिष्ट केल्या आहेत.
युनिट वेळ एकके (तास, मिनिटे, सेकंद, मिलीसेकंद इ.).
कामाची रांग कार्यांसाठी रांगेची अंमलबजावणी.
हँडलर पूर्ण करता येत नसलेल्या कार्यांसाठी हँडलर.
थ्रेडफॅक्टरी मागणीनुसार नवीन थ्रेड तयार करणारी वस्तू. थ्रेड फॅक्टरी वापरल्याने नवीन थ्रेड हार्डवेअरला स्वतंत्रपणे कॉल केले जातात, जे ऍप्लिकेशन्सना विशेष थ्रेड उपवर्ग, प्राधान्यक्रम इत्यादी वापरण्याची परवानगी देतात.

ThreadPoolExecutor तयार करणे

एक्झिक्युटर्स युटिलिटी क्लास ThreadPoolExecutor तयार करणे सोपे करू शकते . या उपयुक्तता वर्गाच्या पद्धती आम्हाला तयार करण्यात मदत करतातThreadPoolExecutorवस्तू

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);
                    

आपण पुढील धड्यांमध्ये प्रत्येक प्रकारच्या तलावाचा विचार करू.