CountDownLatch এবং CyclicBarrier উভয়ই মাল্টিথ্রেডিং পরিবেশে ব্যবহৃত হয় এবং উভয়ই এর অংশ।
জাভা ডক -
অনুযায়ীCountDownLatch - একটি সিঙ্ক্রোনাইজেশন সহায়তা যা এক বা একাধিক থ্রেডকে অপেক্ষা করতে দেয় যতক্ষণ না অন্য থ্রেডগুলিতে সঞ্চালিত অপারেশনগুলির একটি সেট সম্পূর্ণ হয়৷
CyclicBarrier - একটি সিঙ্ক্রোনাইজেশন সাহায্য যা থ্রেডের একটি সেটকে একে অপরকে একটি সাধারণ বাধা বিন্দুতে পৌঁছানোর জন্য অপেক্ষা করতে দেয়৷
| Sr. না। | কী | CyclicBarrier | কাউন্টডাউনল্যাচ |
|---|---|---|---|
| 1 | বেসিক | একটি সিঙ্ক্রোনাইজেশন সহায়তা যা একটি সাধারণ বাধা বিন্দুতে পৌঁছানোর জন্য একে অপরের জন্য অপেক্ষা করার জন্য থ্রেডের একটি সেটকে অনুমতি দেয়। | একটি সিঙ্ক্রোনাইজেশন সহায়তা যা এক বা একাধিক থ্রেডকে অপেক্ষা করতে দেয় যতক্ষণ না অন্য থ্রেডগুলিতে সঞ্চালিত অপারেশনগুলির একটি সেট সম্পূর্ণ হয়। |
| 2 | Runable | এটির একটি কনস্ট্রাক্টর রয়েছে যেখানে রানেবল প্রদান করা যেতে পারে। | এতে এমন কনস্ট্রাক্টর নেই |
| 3 | থ্রেড /টাস্ক | এটি থ্রেডের সংখ্যা বজায় রাখে | এটি কাজের গণনা বজায় রাখে |
| 4. | একটি অগ্রসরযোগ্য | এটি অগ্রসরযোগ্য নয় | এটি অগ্রসরযোগ্য। |
| 5 | ব্যতিক্রম৷ | অপেক্ষা করার সময় যদি একটি থ্রেড বাধাপ্রাপ্ত হয় তাহলে অন্য সব ওয়েটিং থ্রেড B rokenBarrierException নিক্ষেপ করবে | শুধুমাত্র বর্তমান থ্রেড নিক্ষেপ করবে বাধাপ্রাপ্ত ব্যতিক্রম। এটি অন্যান্য থ্রেড প্রভাবিত করবে না |
সাইক্লিক ব্যারিয়ারের উদাহরণ
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) {
// TODO Auto-generated catch block
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} কাউন্টডাউনল্যাচের উদাহরণ
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) {
// TODO Auto-generated catch block
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
latch.countDown();
System.out.println("Services2"+latch.getCount());
}
}