परिचय
CountDownLatch और CyclicBarrier दोनों मल्टीथ्रेडिंग वातावरण में उपयोग किए जाते हैं और दोनों java.util.concurrent पैकेज का हिस्सा हैं।
Java Doc के अनुसार -
CountDownLatch - एक सिंक्रोनाइज़ेशन सहायता जो एक या अधिक थ्रेड्स को तब तक इंतजार करने की अनुमति देती है जब तक अन्य थ्रेड्स में किए जा रहे ऑपरेशन्स का एक सेट पूरा नहीं हो जाता।
CyclicBarrier - एक सिंक्रोनाइज़ेशन सहायता जो थ्रेड्स के एक सेट को एक सामान्य बैरियर पॉइंट पर पहुंचने के लिए एक-दूसरे का इंतजार करने की अनुमति देती है।
| क्र. सं. | मुख्य बिंदु | CyclicBarrier | CountDownLatch |
|---|---|---|---|
| 1 | बुनियादी | एक सिंक्रोनाइज़ेशन सहायता जो थ्रेड्स के एक सेट को एक सामान्य बैरियर पॉइंट पर पहुंचने के लिए एक-दूसरे का इंतजार करने की अनुमति देती है। | एक सिंक्रोनाइज़ेशन सहायता जो एक या अधिक थ्रेड्स को तब तक इंतजार करने की अनुमति देती है जब तक अन्य थ्रेड्स में किए जा रहे ऑपरेशन्स का एक सेट पूरा नहीं हो जाता। |
| 2 | रननेबल | इसमें एक कंस्ट्रक्टर है जहां Runnable प्रदान किया जा सकता है। | इसमें ऐसा कोई कंस्ट्रक्टर नहीं है |
| 3 | थ्रेड/टास्क | यह थ्रेड्स की गिनती रखता है | यह टास्क की गिनती रखता है |
| 4 | एडवांस करने योग्य | यह एडवांस करने योग्य नहीं है | यह एडवांस करने योग्य है। |
| 5 | एक्सेप्शन | यदि एक थ्रेड इंतजार करते समय इंटरप्ट होता है तो अन्य सभी इंतजार कर रहे थ्रेड्स BrokenBarrierException फेंकेंगे | केवल वर्तमान थ्रेड InterruptedException फेंकेगा। यह अन्य थ्रेड्स को प्रभावित नहीं करेगा |
CyclicBarrier का उदाहरण
public class Main {
public static void main(String args[]) throws InterruptedException {
ExecutorService executors = Executors.newFixedThreadPool(4);
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
executors.submit(new Service1(cyclicBarrier));
executors.submit(new Service1(cyclicBarrier));
executors.submit(new Service2(cyclicBarrier));
executors.submit(new Service2(cyclicBarrier));
executors.submit(new Service2(cyclicBarrier));
Thread.sleep(3000);
System.out.println("Done");
}
}
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Service1 implements Runnable {
CyclicBarrier cyclicBarrier;
public Service1(CyclicBarrier cyclicBarrier) {
super();
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println("Services1" + cyclicBarrier.getNumberWaiting());
while (true) {
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Service2 implements Runnable {
CyclicBarrier cyclicBarrier;
public Service2(CyclicBarrier cyclicBarrier) {
super();
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println("Services2" + cyclicBarrier.getNumberWaiting());
while (true) {
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}CountDownLatch का उदाहरण
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());
}
}