জাভা সম্মতি: কাউন্টডাউন ল্যাচ বনাম সাইক্লিক বাধা


160

আমি java.util.concurrent এপিআইয়ের মাধ্যমে পড়ছিলাম এবং এটি পেয়েছি

  • CountDownLatch: একটি সিঙ্ক্রোনাইজেশন সহায়তা যা অন্য থ্রেডে পরিচালিত ক্রিয়াকলাপের সেট সম্পূর্ণ না হওয়া পর্যন্ত এক বা একাধিক থ্রেডের জন্য অপেক্ষা করতে দেয়।
  • CyclicBarrier: একটি সিঙ্ক্রোনাইজেশন সহায়তা যা থ্রেডগুলির একটি সেটকে একে অপরের জন্য একটি সাধারণ বাধা বিন্দুতে অপেক্ষা করার মঞ্জুরি দেয়।

আমার কাছে উভয়ই সমান মনে হলেও আমি নিশ্চিত যে এর আরও অনেক কিছু আছে is

উদাহরণস্বরূপ, ইন CoundownLatch, the countdown value could not be reset, that can happen in the case of CyclicBarrier

দুজনের মধ্যে অন্য কোনও পার্থক্য আছে কি? এমন কেউ
কী আছে use casesযেখানে কেউ গণনা গণনার মান পুনরায় সেট করতে চান?


12
লেচগুলি ইভেন্টগুলির জন্য অপেক্ষা করছে; বাধা অন্যান্য থ্রেডের জন্য অপেক্ষা করছে। - অনুশীলনে জাভা কনকুরન્સી, বি.গয়েজ এট আল al
ব্যবহারকারী 2418306

উত্তর:


137

একটি প্রধান পার্থক্য হ'ল সাইক্লিকবারিয়ার একটি (alচ্ছিক) রান্নেবল টাস্ক নেয় যা সাধারণ বাধা শর্তটি পূরণ করার পরে চালানো হয়।

এটি আপনাকে বাধার অপেক্ষায় থাকা ক্লায়েন্টের সংখ্যা এবং বাধাটি ট্রিগার করার জন্য প্রয়োজনীয় নম্বর পেতে সহায়তা করে। একবার ট্রিগার করা বাধাটি পুনরায় সেট হয়ে গেলে আবার ব্যবহার করা যেতে পারে।

সাধারণ ব্যবহারের ক্ষেত্রে - পরিষেবাগুলি শুরু করা ইত্যাদি ... একটি কাউন্টডাউনল্যাচ ঠিক আছে। আরও জটিল সমন্বয়মূলক কাজের জন্য একটি সাইক্লিকবারিয়ার উপকারী। এই জাতীয় জিনিসের একটি উদাহরণ সমান্তরাল গণনা হবে - যেখানে একাধিক সাবটাস্ক গণনার সাথে জড়িত রয়েছে - যেমন মানচিত্রের মতো ।


6
"এটি আপনাকে বাধার অপেক্ষায় থাকা ক্লায়েন্টের সংখ্যা এবং বাধাটি ট্রিগার করার জন্য প্রয়োজনীয় নম্বর পেতে সহায়তা করে Once আমি সত্যিই এই পয়েন্ট পছন্দ করি। আমি যে কয়েকটি নিবন্ধ পড়েছি তা পরামর্শ দিয়েছে যে সাইক্লিকবারিয়ারটি চক্রযুক্ত কারণ আপনি পুনরায় সেট করতে () পদ্ধতিটি প্রার্থনা করছেন। এটি সত্য, তবে যা তারা প্রায়শই উল্লেখ করেন না তা হ'ল বাধাটি ট্রিগার হওয়ার সাথে সাথেই স্বয়ংক্রিয়ভাবে পুনরায় সেট হয়ে যায়। আমি এটি উদাহরণস্বরূপ কিছু নমুনা কোড পোস্ট করব।
কেভিন লি

@ কেভিন লী "বাধাটি ট্রিগার হওয়ার সাথে সাথেই স্বয়ংক্রিয়ভাবে পুনরায় সেট হয়ে যাবে" এর জন্য ধন্যবাদ। সুতরাং কোডে রিসেট () কল করার দরকার নেই।
সুপারনোভা

134

আরও একটি পার্থক্য আছে।

একটি ব্যবহার করার সময় CyclicBarrier, অনুমানটি হ'ল আপনি অপেক্ষার থ্রেডগুলির সংখ্যা নির্দিষ্ট করেন যা বাধাটিকে ট্রিগার করে। যদি আপনি 5 নির্দিষ্ট করে থাকেন তবে কল করার জন্য আপনার কমপক্ষে 5 টি থ্রেড থাকতে হবে await()

একটি ব্যবহার করার সময় CountDownLatch, আপনি countDown()যে কলগুলির সংখ্যা উল্লেখ করেছেন তার ফলস্বরূপ সমস্ত অপেক্ষার থ্রেড প্রকাশিত হবে। এর অর্থ আপনি CountDownLatchকেবলমাত্র একটি একক থ্রেড সহ একটি ব্যবহার করতে পারেন ।

"আপনি এটি করতে চান কেন?", আপনি বলতে পারেন। কল্পনা করুন আপনি কলব্যাকগুলি সম্পাদনকারী অন্য কেউ দ্বারা কোডেড একটি রহস্যময় এপিআই ব্যবহার করছেন। নির্দিষ্ট কলব্যাককে বেশ কয়েকবার কল না দেওয়া পর্যন্ত আপনি নিজের থ্রেডগুলির একটি অপেক্ষা করতে চান। কলব্যাকটি কোন থ্রেডে কল হবে তা আপনার কোনও ধারণা নেই। এই ক্ষেত্রে, একটি CountDownLatchনিখুঁত, যদিও আমি এটি ব্যবহার করে এটি বাস্তবায়নের কোনও উপায় সম্পর্কে ভাবতে পারি না CyclicBarrier(আসলে, আমি পারি, তবে এতে সময়সীমা জড়িত ... ইয়াক!)।

আমি কেবল চাই যে CountDownLatchপুনরায় সেট করা যেতে পারে!


10
আমি মনে করি এটিই উত্তর যা তাত্ত্বিক পার্থক্যগুলি আরও ভাল দেখায়। এই বিষয়টি যে ল্যাচগুলি কেবল একাধিক সময়কে একটি পদ্ধতি কল করে ভেঙে ফেলা যায় যখন বাধাগুলি অপেক্ষা করতে অপেক্ষা থ্রেডগুলির একটি যথাযথ পরিমাণ প্রয়োজন ()।
ফ্ল্যাগ

43
ডান - এটি প্রধান পার্থক্য: কাউন্টডাউনল্যাচ -> নাম্বার অফকেলস, ​​সাইক্লিকবারিয়ার -> সংখ্যাঅফট্রেডস
ইভান

1
আমি সম্মত হই যে এটি CountDownLatchপুনঃনির্দেশযোগ্য হওয়ার পক্ষে দুর্দান্ত হবে - CountDownLatchসুরক্ষিত কোড ব্লকটি প্রবেশ করা হলে (যখন ল্যাচ শূন্যে পৌঁছে যায়) তখন আমি কোনও প্রত্যাশা -বিজ্ঞপ্তি বাস্তবায়নের জন্য ব্যবহার করি work এটি অবশ্যই সমস্ত পরিস্থিতিতে / স্কোপগুলিতে প্রযোজ্য নয়, তবে আমি মনে করেছি যে এটি সোনারলোকসের পরিস্থিতিতে একটি বিকল্প।
এফেমেরা

2
এই বিষয়ের সেরা উত্তরগুলির মধ্যে একটি। Java Concurrency in Practice- একই জিনিস বলে: Latches are for waiting for events; barriers are for waiting for other threads.। এই দুটিয়ের মধ্যে পার্থক্য বোঝার জন্য একটি প্রাথমিক এবং প্রয়োজনীয় বিষয়।
রাহুল দেব মিশ্র

জাভা 8 ডকটি বলেছে "এন থেকে সূচনা করা একটি কাউন্টডাউনল্যাচ এন থ্রেড কিছু ক্রিয়া সম্পন্ন না করা পর্যন্ত, বা কিছু ক্রিয়া এন বার সম্পন্ন না হওয়া পর্যন্ত একটি থ্রেড অপেক্ষা করতে ব্যবহৃত হতে পারে" " আমার মনে হচ্ছে: CountDownLatch -> NUMBEROFCALLS টি অথবা CountDownLatch -> NumberOfThreads
Nir

41

একটি পয়েন্ট যা এখনও কেউ উল্লেখ করেনি তা হ'ল, একটিতে CyclicBarrierযদি কোনও থ্রেডে সমস্যা হয় (সময়সীমা, বাধা ...), অন্য যে সমস্ত জায়গায় পৌঁছেছে await()তারা ব্যতিক্রম পায়। জাভাদোক দেখুন:

সাইক্লিক ব্যারিয়ার ব্যর্থ সিঙ্ক্রোনাইজেশন প্রয়াসের জন্য অল-অ-বা-না-ব্রেক ব্রেক মডেল ব্যবহার করে: কোনও থ্রেড যদি বাধা, ব্যর্থতা বা সময়সীমা কারণে অকাল আগে বাধা পয়েন্ট ছেড়ে যায়, তবে সেই বাধা পয়েন্টে অপেক্ষারত অন্যান্য সমস্ত থ্রেডও ব্রোকেনবাড়িয়ার এক্সসেপশন (বা বাধাপ্রাপ্তি এক্সসেপশন) এর মাধ্যমে অস্বাভাবিকভাবে ছেড়ে যাবে যদি সেগুলিও প্রায় একই সময়ে বাধা হয়ে থাকে)।


22

আমি মনে করি যে জাভাডক পার্থক্যগুলি স্পষ্টভাবে ব্যাখ্যা করেছে। বেশিরভাগ লোকই জানেন যে কাউন্টডাউনল্যাচ পুনরায় সেট করা যাবে না, তবে সাইক্লিকবারিয়ার পারে। তবে এটি কেবলমাত্র পার্থক্য নয়, বা সাইক্লিক ব্যারিয়ারটির নামকরণ করা যেতে পারে রিসেটব্যাক্টডাউনডাউনচে। জাভাডক-এ বর্ণিত আমাদের লক্ষ্যগুলির দৃষ্টিভঙ্গি থেকে আমাদের পার্থক্যগুলি বলা উচিত

কাউন্টডাউনল্যাচ: একটি সিঙ্ক্রোনাইজেশন সহায়তা যা অন্য থ্রেডে পরিচালিত ক্রিয়াকলাপের সেট শেষ না হওয়া পর্যন্ত এক বা একাধিক থ্রেডের জন্য অপেক্ষা করতে দেয়।

সাইক্লিকবারিয়ার: একটি সিঙ্ক্রোনাইজেশন সহায়তা যা থ্রেডগুলির একটি সেটকে একে অপরের জন্য একটি সাধারণ বাধা বিন্দুতে অপেক্ষা করার অনুমতি দেয়।

কাউন্টডাউনল্যাচে একটি বা একাধিক থ্রেড রয়েছে, যা অন্য থ্রেডগুলির একটি সেট সম্পূর্ণ হওয়ার জন্য অপেক্ষা করছে । এই পরিস্থিতিতে, দুটি ধরণের থ্রেড রয়েছে, একটি প্রকারের জন্য অপেক্ষা করা হচ্ছে, অন্য ধরণের কিছু করা হচ্ছে, তাদের কাজ শেষ হওয়ার পরে তারা অপেক্ষা করতে বা কেবল সমাপ্ত হতে পারে।

সাইক্লিকবারিয়ারে, কেবল এক ধরণের থ্রেড রয়েছে, তারা একে অপরের জন্য অপেক্ষা করছে, তারা সমান।


1
"সাইক্লিকবারিয়ারে, কেবল এক ধরণের থ্রেড থাকে" ... অন্য থ্রেড না বলা পর্যন্ত তারা তাদের "অপেক্ষার ভূমিকা" সমান awa "বায়েত (), তবে তারা" তারা যা করেন তাতে সমান নয় "। এছাড়াও এগুলি অবশ্যই একই ধরণের বা বিভিন্ন ধরণের একেবারে পৃথক থ্রেড উদাহরণ (!) হওয়া উচিত, যখন কাউন্টডাউনলেচে একই থ্রেডটি কাউন্টডাউন () কল করতে পারে এবং ফলাফলকে প্রভাবিত করে।
ভ্লাদিমির নবোকভ

আমি সম্মত হই যে কাউন্টডাউনল্যাচের সহজাতভাবে দুটি ভূমিকা দরকার: কাউন্টডাউনের জন্য একটি ক্লায়েন্ট এবং অপেক্ষার জন্য একটি ক্লায়েন্ট। অন্যদিকে, সাইক্লিকবারিয়ার ক্লায়েন্টরা অপেক্ষা করার পদ্ধতিটি সহ কেবল সূক্ষ্মভাবে পরিচালনা করতে পারে।
isaolmez

14

প্রধান পার্থক্যটি ডাব্লুড করা হয়েছে জাভাদোক্সে কাউন্টডাউনল্যাচের জন্য। যথা:

একটি কাউন্টডাউনল্যাচ একটি প্রদত্ত গণনা দিয়ে শুরু করা হয়। কাউন্টডাউন () পদ্ধতির অনুরোধের কারণে বর্তমান গণনা শূন্যের না হওয়া পর্যন্ত অপেক্ষা করা পদ্ধতিগুলি অবরুদ্ধ হয়ে যায়, তারপরে সমস্ত অপেক্ষার থ্রেড প্রকাশিত হয় এবং তত্ক্ষণাত প্রত্যাবর্তনের প্রত্যাবর্তনের অনুরোধ জানানো হয়। এটি একটি শট ঘটনা - গণনাটি পুনরায় সেট করা যায় না। আপনার যদি এমন কোনও সংস্করণ প্রয়োজন হয় যা গণনাটিকে পুনরায় সেট করে, সাইক্লিকবারিয়ার ব্যবহার বিবেচনা করুন।

উত্স 1.6 জাভাদোক


4
যদি তাদের পার্থক্যটি কেবল পুনরায় সেট করা যায় বা না করা যায় তবে সাইক্লিকবারিয়ারটির নাম রিসেটেবলকাউন্টডাউনল্যাচ হতে পারে, যা পার্থক্যের কারণে আরও অর্থবহ।
জেমস.এক্সইউ

12

একটি কাউন্টডাউনল্যাচ ওয়ান-টাইম সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয়। একটি কাউন্টডাউনল্যাচ ব্যবহার করার সময়, কোনও থ্রেডকে কাউন্টডাউন () যতবার তারা কল করতে অনুমতি দেয় times অপেক্ষারত () নামক থ্রেডগুলি অন্য অবরোধযুক্ত থ্রেডের মাধ্যমে কাউন্টডাউন () এ কল করার কারণে গণনা শূন্য না হওয়া অবধি অবরুদ্ধ থাকবে। CountDownLatch জন্য javadoc পদ বলে:

কাউন্টডাউন () পদ্ধতির অনুরোধের কারণে বর্তমান গণনা শূন্যের না হওয়া পর্যন্ত অপেক্ষা করা পদ্ধতিগুলি অবরুদ্ধ হয়ে যায়, তারপরে সমস্ত অপেক্ষার থ্রেড প্রকাশিত হয় এবং তত্ক্ষণাত প্রত্যাবর্তনের প্রত্যাবর্তনের অনুরোধ জানানো হয়। ...

আর একটি সাধারণ ব্যবহার হ'ল সমস্যাটি এন অংশগুলিতে বিভক্ত করা, প্রতিটি অংশকে রান্নেবল দিয়ে বর্ণনা করা যা সেই অংশটি কার্যকর করে এবং ল্যাচটিতে গণনা করে এবং সমস্ত রান্নেবলকে একটি নির্বাহকের কাছে সারি করে। সমস্ত উপ-অংশ সম্পূর্ণ হয়ে গেলে, সমন্বয়কারী থ্রেড প্রতীক্ষার মধ্য দিয়ে যেতে সক্ষম হবে। (যখন থ্রেডগুলি বারবার এইভাবে গণনা করতে হবে, তার পরিবর্তে সাইক্লিকবারিয়ার ব্যবহার করুন))

বিপরীতে, চক্রীয় বাধা একাধিক সিঙ্ক্রোনাইজেশন পয়েন্টগুলির জন্য ব্যবহৃত হয়, উদাহরণস্বরূপ যদি থ্রেডগুলির একটি সেট একটি লুপ / ​​পর্যায়যুক্ত গণনা চালাচ্ছে এবং পরবর্তী পুনরাবৃত্তি / পর্ব শুরু করার আগে সিঙ্ক্রোনাইজ করা দরকার। অনুযায়ী CyclicBarrier জন্য javadoc :

বাধাটিকে সাইক্লিক বলা হয় কারণ অপেক্ষার থ্রেডগুলি প্রকাশের পরে এটি আবার ব্যবহার করা যেতে পারে।

কাউন্টডাউনল্যাচের বিপরীতে, অপেক্ষা করা প্রতিটি কল () কোনও না কোনও পর্যায়ের অন্তর্ভুক্ত এবং থ্রেডটি ব্লক করতে পারে যতক্ষণ না phase পর্বের অন্তর্ভুক্ত সমস্ত পক্ষ প্রত্যাশিত () প্রত্যাখ্যান না করে। সাইক্লিকবারিয়ার দ্বারা সমর্থিত কোনও সুস্পষ্ট কাউন্টডাউন () অপারেশন নেই।


12

এই প্রশ্নের ইতিমধ্যে ইতিমধ্যে যথেষ্ট উত্তর দেওয়া হয়েছে, তবে আমি মনে করি কিছু কোড পোস্ট করে আমি কিছুটা মূল্য সংযোজন করতে পারি।

চক্রীয় বাধার আচরণ চিত্রিত করতে, আমি কিছু নমুনা কোড তৈরি করেছি। বাধা টিপানোর সাথে সাথে এটি স্বয়ংক্রিয়ভাবে পুনরায় সেট হয়ে যায় যাতে এটি আবার ব্যবহার করা যায় (সুতরাং এটি "চক্রযুক্ত")। আপনি যখন প্রোগ্রামটি চালান, লক্ষ্য করুন বাধা টিপ দেওয়ার পরে মুদ্রণ আউট "লেটস প্লে" চালিত হবে।

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierCycles {

    static CyclicBarrier barrier;

    public static void main(String[] args) throws InterruptedException {
        barrier = new CyclicBarrier(3); 

        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
        Thread.sleep(1000);

        System.out.println("Barrier automatically resets.");

        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
    }

}


class Worker extends Thread {
    @Override
    public void run() {
        try {
            CyclicBarrierCycles.barrier.await();
            System.out.println("Let's play.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

8

আমি যখন লাচস এবং সাইক্লিকবারিয়ারগুলি নিয়ে অধ্যয়ন করছিলাম তখন আমি এই রূপকগুলি নিয়ে এসেছি। চক্রবৃদ্ধি : কল্পনা করুন যে কোনও সংস্থার একটি সভা ঘর আছে meeting সভাটি শুরু করতে, নির্দিষ্ট সংখ্যক বৈঠকে উপস্থিত থাকতে হবে (এটিকে অফিসিয়াল করার জন্য) make নিম্নলিখিত একটি সাধারণ সভা অংশগ্রহণকারী (একটি কর্মচারী) এর কোড

class MeetingAtendee implements Runnable {

CyclicBarrier myMeetingQuorumBarrier;

public MeetingAtendee(CyclicBarrier myMileStoneBarrier) {
    this.myMeetingQuorumBarrier = myMileStoneBarrier;
}

@Override
public void run() {
    try {
        System.out.println(Thread.currentThread().getName() + " i joined the meeting ...");
        myMeetingQuorumBarrier.await();
        System.out.println(Thread.currentThread().getName()+" finally meeting stared ...");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (BrokenBarrierException e) {
        System.out.println("Meeting canceled! every body dance <by chic band!>");
    }
 }
}

কর্মচারী বৈঠকে যোগদান করে, অন্যদের সভা শুরু করার জন্য অপেক্ষা করে। এছাড়াও সভাটি বাতিল হয়ে গেলে তিনি প্রস্থানিত হন :) তবে আমাদের কাছে বসগুলি কীভাবে অন্যদের দেখানোর জন্য অপেক্ষা করা পছন্দ করে না এবং যদি সে তার রোগীকে ছেড়ে দেয় তবে সে সভাটি বাতিল করে দেয়।

class MeetingAtendeeTheBoss implements Runnable {

CyclicBarrier myMeetingQuorumBarrier;

public MeetingAtendeeTheBoss(CyclicBarrier myMileStoneBarrier) {
    this.myMeetingQuorumBarrier = myMileStoneBarrier;
}

@Override
public void run() {
    try {
        System.out.println(Thread.currentThread().getName() + "I am THE BOSS - i joined the meeting ...");
        //boss dose not like to wait too much!! he/she waits for 2 seconds and we END the meeting
        myMeetingQuorumBarrier.await(1,TimeUnit.SECONDS);
        System.out.println(Thread.currentThread().getName()+" finally meeting stared ...");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (BrokenBarrierException e) {
        System.out.println("what WHO canceled The meeting");
    } catch (TimeoutException e) {
        System.out.println("These employees waste my time!!");
    }
 }
}

একটি সাধারণ দিনে, কর্মচারীরা অন্য দেখানোর জন্য অপেক্ষা করতে বৈঠকে আসে এবং যদি কিছু উপস্থিত না আসে তবে তাদের অনির্দিষ্টকালের জন্য অপেক্ষা করতে হবে! কিছু বিশেষ সভায় বস আসে এবং তিনি অপেক্ষা করতে পছন্দ করেন না। (5 জন ব্যক্তির সাক্ষাত্কার শুরু করা দরকার তবে কেবল বস আসবেন এবং একজন উত্সাহী কর্মচারীও) তাই তিনি সভাটি বাতিল করেন (ক্ষুব্ধ হয়ে)

CyclicBarrier meetingAtendeeQuorum = new CyclicBarrier(5);
Thread atendeeThread = new Thread(new MeetingAtendee(meetingAtendeeQuorum));
Thread atendeeThreadBoss = new Thread(new MeetingAtendeeTheBoss(meetingAtendeeQuorum));
    atendeeThread.start();
    atendeeThreadBoss.start();

আউটপুট:

//Thread-1I am THE BOSS - i joined the meeting ...
// Thread-0 i joined the meeting ...
// These employees waste my time!!
// Meeting canceled! every body dance <by chic band!>

আরও একটি দৃশ্য রয়েছে যাতে আরও একটি বহিরাগত থ্রেড (একটি পৃথিবী ভূমিকম্প) সভাটি বাতিল করে দেয় (কল রিসেট পদ্ধতি)। এই ক্ষেত্রে সমস্ত অপেক্ষার থ্রেড একটি ব্যতিক্রম দ্বারা জাগ্রত হয়।

class NaturalDisasters implements Runnable {

CyclicBarrier someStupidMeetingAtendeeQuorum;

public NaturalDisasters(CyclicBarrier someStupidMeetingAtendeeQuorum) {
    this.someStupidMeetingAtendeeQuorum = someStupidMeetingAtendeeQuorum;
}

void earthQuakeHappening(){
    System.out.println("earth quaking.....");
    someStupidMeetingAtendeeQuorum.reset();
}

@Override
public void run() {
    earthQuakeHappening();
 }
}

চলমান কোডের ফলে মজার ফলাফল পাওয়া যাবে:

// Thread-1I am THE BOSS - i joined the meeting ...
// Thread-0 i joined the meeting ...
// earth quaking.....
// what WHO canceled The meeting
// Meeting canceled! every body dance <by chic band!>

আপনি মিটিং রুমে একজন সচিবকেও যুক্ত করতে পারেন, কোনও সভা অনুষ্ঠিত হলে তিনি প্রতিটি বিষয় নথিভুক্ত করবেন তবে তিনি সভার অংশ নন:

class MeetingSecretary implements Runnable {

@Override
public void run() {
        System.out.println("preparing meeting documents");
        System.out.println("taking notes ...");
 }
}

লেচস : রাগী বস যদি কোম্পানির গ্রাহকদের জন্য একটি প্রদর্শনী রাখতে চান তবে প্রতিটি জিনিস প্রস্তুত (সংস্থান) করা দরকার। আমরা প্রতিটি কর্মী (থ্রেড) তার কাজ ডোজ প্রদান করি এবং আমরা করণীয় তালিকাটি পরীক্ষা করি (কিছু শ্রমিক পেইন্টিং করেন, অন্যরা সাউন্ড সিস্টেম প্রস্তুত করেন ...)। করণীয় তালিকার সমস্ত আইটেম সম্পূর্ণ হয়ে গেলে (সংস্থানগুলি সরবরাহ করা হয়) আমরা গ্রাহকদের জন্য দরজা খুলতে পারি।

public class Visitor implements Runnable{

CountDownLatch exhibitonDoorlatch = null;

public Visitor (CountDownLatch latch) {
    exhibitonDoorlatch  = latch;
}

public void run() {
    try {
        exhibitonDoorlatch .await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("customer visiting exebition");
 }
}

এবং কর্মীরা কীভাবে প্রদর্শনীটি প্রস্তুত করছেন:

class Worker implements Runnable {

CountDownLatch myTodoItem = null;

public Worker(CountDownLatch latch) {
    this.myTodoItem = latch;
}

public void run() {
        System.out.println("doing my part of job ...");
        System.out.println("My work is done! remove it from todo list");
        myTodoItem.countDown();
 }
}

    CountDownLatch preperationTodoList = new CountDownLatch(3);

    // exhibition preparation workers  
    Worker      electricalWorker      = new Worker(preperationTodoList);
    Worker      paintingWorker      = new Worker(preperationTodoList);

    // Exhibition Visitors 
    ExhibitionVisitor exhibitionVisitorA = new ExhibitionVisitor(preperationTodoList);
    ExhibitionVisitor exhibitionVisitorB = new ExhibitionVisitor(preperationTodoList);
    ExhibitionVisitor exhibitionVisitorC = new ExhibitionVisitor(preperationTodoList);

    new Thread(electricalWorker).start();
    new Thread(paintingWorker).start();

    new Thread(exhibitionVisitorA).start();
    new Thread(exhibitionVisitorB).start();
    new Thread(exhibitionVisitorC).start();

7

সংক্ষেপে , কেবল দুজনের মধ্যে মূল কার্যকরী পার্থক্যগুলি বোঝার জন্য :

public class CountDownLatch {
    private Object mutex = new Object();
    private int count;

    public CountDownLatch(int count) {
        this.count = count;
    }

    public void await() throws InterruptedException {
        synchronized (mutex) {
            while (count > 0) {
                mutex.wait();
            }
        }
    }

    public void countDown() {
        synchronized (mutex) {
            if (--count == 0)
                mutex.notifyAll();
        }

    }
}

এবং

public class CyclicBarrier {
    private Object mutex = new Object();
    private int count;

    public CyclicBarrier(int count) {
        this.count = count;
    }

    public void await() throws InterruptedException {
        synchronized (mutex) {
            count--;
            while(count > 0)
                mutex.wait();
            mutex.notifyAll();
        }
    }
}

অবশ্যই, অ-ব্লকিং, সময়সীমার অপেক্ষা, ডায়াগনস্টিকস এবং সমস্ত কিছু যা বিবরণে উপরের উত্তরে ব্যাখ্যা করা হয়েছে সেগুলি বাদ দিয়ে।

উপরোক্ত ক্লাসগুলি তবে সরবরাহকৃত কার্যকারিতার মধ্যে সম্পূর্ণভাবে কার্যকরী এবং সমতুল্য, তাদের সংবাদদাতাদের নামকেই।

ভিন্ন নোটে, CountDownLatchঅভ্যন্তরীণ শ্রেণীর সাবক্লাসগুলি ব্যবহার করার AQSসময় (আমার সন্দেহ এটি অন্যান্য উপায়ে হতে পারে বা উভয়ই একিউএস ব্যবহার করতে পারে বা উভয়ই লক ব্যবহার করতে পারে - পারফরম্যান্স দক্ষতার কোনও ক্ষতি ছাড়াই)CyclicBarrierReentrantLock


5

একটি স্পষ্ট পার্থক্য হ'ল, কেবলমাত্র এন থ্রেডগুলি একটি চক্রের মুক্তির জন্য এন এর সাইক্লিকবারিয়ার অপেক্ষা করতে পারে। তবে সীমাহীন সংখ্যক থ্রেড এন এর একটি কাউন্টডাউনল্যাচে অপেক্ষা করতে পারে The কাউন্ট ডাউন হ্রাসটি একটি থ্রেড এন টাইম বা এন থ্রেড দ্বারা প্রতিবার বা সংমিশ্রণে করা যেতে পারে।


4

সাইক্লিক ব্যারিয়ারের ক্ষেত্রে, সমস্ত শিশু থ্রেডগুলি বাধা কল করতে শুরু করার সাথে সাথেইএইভিটি (), রানারবেল ব্যারিয়ারে মৃত্যুদন্ড কার্যকর করা হয়। প্রতিটি সন্তানের থ্রেডে বাধা.উইটটি শেষ করতে বিভিন্ন দৈর্ঘ্য সময় নেয় এবং এগুলি একই সাথে শেষ হয়।


4

ইন CountDownLatch , অন্যান্য থ্রেড জন্য প্রধান থ্রেড অপেক্ষা করছে তাদের ফাঁসি সম্পন্ন করতে। ইন CyclicBarrier , কর্মী থ্রেড তাদের ফাঁসি সম্পন্ন করতে একে অপরের জন্য অপেক্ষা করুন।

আপনি একই পুনরায় ব্যবহার করতে পারবেন না একবার গণনা শূন্যে পৌঁছে এবং ল্যাচটি খোলা থাকলে কাউন্টডাউনল্যাচ উদাহরণটি , অন্যদিকে সাইক্লিক ব্যারিয়ার ব্যারিয়ারটি পুনরায় সেট করে আবার ব্যবহার করা যেতে পারে, একবার বাধা ভেঙে গেলে।


এটির মূল থ্রেড হওয়ার দরকার নেই। এটি এমন কোনও থ্রেড হতে পারে যা কাউন্টডাউনল্যাচ তৈরি করে এবং অন্যান্য অ-প্রধান থ্রেডের সাথে ভাগ করে।
অনিকেত ঠাকুর

1

কাউন্টডাউনল্যাচ হ'ল কোনও কিছুর একটি গণনা; সাইক্লিকবারিয়ারটি কেবল থ্রেডের জন্য একটি গণনা

ধরে নিন 5 জন কর্মী থ্রেড এবং একটি শিপার থ্রেড রয়েছে এবং যখন শ্রমিকরা 100 টি আইটেম উত্পাদন করে, শিপর সেগুলি বহন করে দেবে।

কাউন্টডাউনল্যাচের জন্য, কাউন্টারটি শ্রমিক বা আইটেমগুলিতে থাকতে পারে

সাইক্লিকবারিয়ারের জন্য, কাউন্টারটি কেবলমাত্র কর্মীদের উপর থাকতে পারে

কোনও শ্রমিক যদি আইটেমগুলিতে কাউন্টডাউনল্যাচ সহ অসীম নিদ্রায় পড়ে তবে শিপিং জাহাজ চালাতে পারে; যাইহোক, সাইক্লিকবারিয়ার সাথে, শিপারকে কখনও কল করা যায় না


0

@ কেভিন লি এবং @ জন আমি cচ্ছিক চলমান সাথে সাইক্লিকবারিয়ার চেষ্টা করেছি। দেখে মনে হচ্ছে এটি শুরুতে এবং সিক্লিকবারিয়ার টিপ দেওয়ার পরে চলে। এখানে কোড এবং আউটপুট

স্থির সাইক্লিকবারিয়ার বাধা;

    public static void main(String[] args) throws InterruptedException {
        barrier = new CyclicBarrier(3, new Runnable() {
            @Override
            public void run() {
                System.out.println("I run in the beginning and after the CyclicBarrier is tipped");
            }
        });

        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
        Thread.sleep(1000);

        System.out.println("Barrier automatically resets.");

        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
        Thread.sleep(1000);
        new Worker().start();
    }

আউটপুট

I run in the beginning and after the CyclicBarrier is tipped
Let's play.
Let's play.
Let's play.
Barrier automatically resets.
I run in the beginning and after the CyclicBarrier is tipped
Let's play.
Let's play.
Let's play.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.