Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java कंकरेंसी में CountDownLatch और CyclicBarrier के बीच अंतर

परिचय

CountDownLatch और CyclicBarrier दोनों मल्टीथ्रेडिंग वातावरण में उपयोग किए जाते हैं और दोनों java.util.concurrent पैकेज का हिस्सा हैं।

Java Doc के अनुसार -

CountDownLatch - एक सिंक्रोनाइज़ेशन सहायता जो एक या अधिक थ्रेड्स को तब तक इंतजार करने की अनुमति देती है जब तक अन्य थ्रेड्स में किए जा रहे ऑपरेशन्स का एक सेट पूरा नहीं हो जाता।

CyclicBarrier - एक सिंक्रोनाइज़ेशन सहायता जो थ्रेड्स के एक सेट को एक सामान्य बैरियर पॉइंट पर पहुंचने के लिए एक-दूसरे का इंतजार करने की अनुमति देती है।

क्र. सं.मुख्य बिंदुCyclicBarrierCountDownLatch
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());
    }
}
  1. - जावा में Serialization और Externalization के बीच अंतर

    Serialization और Externalization दोनों ऑब्जेक्ट को बाइट स्ट्रीम में बदलने और बाइट स्ट्रीम को डेटाबेस या मेमोरी में स्टोर करने की प्रक्रियाएं हैं। जो क्लास java.io.Serializable इंटरफेस को इम्प्लीमेंट करती है उसे सीरियलाइज किया जा सकता है। दूसरी ओर, Externalization एप्लिकेशन में आवश्यकता के आधार पर कस

  1. - जावा में Iterator और Enumeration के बीच अंतर

    Iterator और Enumeration दोनों कलेक्शन से एलिमेंट्स को ट्रैवर्स और एक्सेस करने के लिए कर्सर हैं। वे दोनों कलेक्शन फ्रेमवर्क से संबंधित हैं। Enumeration JDK 1.0 में जोड़ा गया था और Iterator JDK 1.2 वर्जन में कलेक्शन फ्रेमवर्क में जोड़ा गया। Enumeration कलेक्शन में स्ट्रक्चरल चेंज नहीं कर सकता क्योंकि

  1. - Java में ArrayList और HashSet के बीच अंतर

    HashSet और ArrayList दोनों Java कलेक्शन फ्रेमवर्क के सबसे महत्वपूर्ण क्लासेस में से कुछ हैं।ArrayList और HashSet के बीच महत्वपूर्ण अंतर निम्नलिखित हैं।क्रमांकमुख्य बिंदुArrayListHashSet1कार्यान्वयनArrayList लिस्ट इंटरफेस का कार्यान्वयन है।दूसरी ओर HashSet सेट इंटरफेस का कार्यान्वयन है।2आंतरिक कार्या