परिचय
एग्जीक्यूटर फ्रेमवर्क थ्रेड पूल अवधारणा का उपयोग करके डिज़ाइन किए गए हैं। थ्रेड पूल वर्तमान टास्क को निष्पादित करने के लिए हर बार एक नया थ्रेड बनाने के बजाय पहले से बने थ्रेड का पुन: उपयोग करने का तरीका है।
Executors क्लास थ्रेड पूल बनाने के लिए एक फैक्ट्री मेथड प्रदान करता है। ThreadPoolExecutor क्लास कई Executors फैक्ट्री मेथड्स से लौटाए गए एक्जीक्यूटर्स के लिए बेस इम्प्लीमेंटेशन है।
| क्र. सं. | मुख्य बिंदु | फिक्स्ड थ्रेड पूल | कैश्ड थ्रेड पूल |
|---|---|---|---|
| 1 | बुनियादी | Java Doc के अनुसार - एक थ्रेड पूल बनाता है जो एक शेयर्ड अनबाउंडेड क्यू से ऑपरेट होने वाले फिक्स्ड नंबर के थ्रेड्स का पुन: उपयोग करता है। किसी भी बिंदु पर, अधिकतम nThreads थ्रेड्स टास्क प्रोसेस करने में सक्रिय होंगे। यदि सभी थ्रेड्स सक्रिय होने पर अतिरिक्त टास्क सबमिट किए जाते हैं, तो वे क्यू में तब तक इंतजार करेंगे जब तक कोई थ्रेड उपलब्ध न हो। यदि निष्पादन के दौरान विफलता के कारण कोई थ्रेड समाप्त होता है, तो यदि बाद के टास्क को निष्पादित करने के लिए आवश्यक हो तो एक नया उसकी जगह लेगा। पूल में थ्रेड्स तब तक मौजूद रहेंगे जब तक इसे स्पष्ट रूप से शटडाउन नहीं किया जाता। | Java Doc के अनुसार - एक थ्रेड पूल बनाता है जो आवश्यकतानुसार नए थ्रेड्स बनाता है, लेकिन जब उपलब्ध हों तो पहले से बने थ्रेड्स का पुन: उपयोग करेगा। ये पूल आमतौर पर उन प्रोग्राम्स के प्रदर्शन में सुधार करते हैं जो कई शॉर्ट-लिव्ड एसिंक्रोनस टास्क निष्पादित करते हैं। execute कॉल पहले से बने थ्रेड्स का पुन: उपयोग करेंगे यदि उपलब्ध हों। यदि कोई मौजूदा थ्रेड उपलब्ध नहीं है, तो एक नया थ्रेड बनाया जाएगा और पूल में जोड़ा जाएगा। |
| 2 | क्यू | यह ब्लॉकिंग क्यू का उपयोग करता है। | यह SynchronousQueue का उपयोग करता है। |
| 3 | थ्रेड लाइफटाइम | यह सभी थ्रेड्स को तब तक चलाता रहेगा जब तक उन्हें स्पष्ट रूप से समाप्त नहीं किया जाता | साठ सेकंड तक उपयोग न किए गए थ्रेड्स समाप्त हो जाते हैं और कैश से हटा दिए जाते हैं |
| 4 | थ्रेड पूल साइज | थ्रेड पूल साइज फिक्स्ड है इसलिए यह बढ़ेगा नहीं। | थ्रेड पूल शून्य थ्रेड्स से Integer.MAX_VALUE तक बढ़ सकता है |
| 5 | उपयोग का मामला | हमें फिक्स्ड थ्रेड पूल का उपयोग करना चाहिए, जब हम समवर्ती टास्क को सीमित करना चाहते हैं | इसका उपयोग तब किया जा सकता है जब आपके पास बहुत सारे अनुमानित टास्क हों। |
फिक्स्ड थ्रेड पूल का उदाहरण
public class Main {
public static void main(String args[]) throws InterruptedException {
ExecutorService executors = Executors.newFixedThreadPool(4);
CountDownLatch latch = new CountDownLatch(2);
executors.submit(new Service1(latch));
executors.submit(new Service2(latch));
latch.await();
System.out.println("Done");
}
}
import java.util.concurrent.CountDownLatch;
public class Service1 implements Runnable {
CountDownLatch latch;
public Service1(CountDownLatch latch) {
super();
this.latch = latch;
}
@Override
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
System.out.println("Services2" + latch.getCount());
}
}
import java.util.concurrent.CountDownLatch;
public class Service2 implements Runnable {
CountDownLatch latch;
public Service2(CountDownLatch latch) {
super();
this.latch = latch;
}
@Override
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
System.out.println("Services2" + latch.getCount());
}
}