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