CyclicBarrier এবং Phaser এর ব্যবহার

Semaphore এবং CountDownLatch - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

331

জাভার CyclicBarrier এবং Phaser হলো কনকারেন্সি টুলস, যা একাধিক থ্রেডের মধ্যে সিঙ্ক্রোনাইজেশন নিশ্চিত করতে ব্যবহৃত হয়। এগুলো java.util.concurrent প্যাকেজের অংশ এবং মাল্টিথ্রেডেড অ্যাপ্লিকেশনে ব্যবহৃত হয়।


১. CyclicBarrier

CyclicBarrier একটি ব্যারিয়ার বা প্রতিবন্ধক যা একটি নির্দিষ্ট সংখ্যক থ্রেড পৌঁছানোর পর কাজ শুরু করতে দেয়। এটি মূলত এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে নির্দিষ্ট সংখ্যক থ্রেড একসঙ্গে কাজ শুরু করবে।

বৈশিষ্ট্য:

  1. একটি নির্দিষ্ট সংখ্যক থ্রেড পৌঁছানোর অপেক্ষা করে।
  2. একবার সক্রিয় হলে এটি পুনরায় ব্যবহারযোগ্য (Cyclic)।
  3. ঐচ্ছিকভাবে একটি Runnable প্রদান করা যায়, যা ব্যারিয়ারে পৌঁছানোর পরে চালানো হয়।

CyclicBarrier উদাহরণ:

import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {
    public static void main(String[] args) {
        // ৩টি থ্রেডের জন্য একটি ব্যারিয়ার তৈরি করুন
        CyclicBarrier barrier = new CyclicBarrier(3, () -> {
            System.out.println("All threads reached the barrier. Task can proceed.");
        });

        Runnable task = () -> {
            try {
                System.out.println(Thread.currentThread().getName() + " is waiting at the barrier.");
                barrier.await(); // ব্যারিয়ারে অপেক্ষা
                System.out.println(Thread.currentThread().getName() + " has crossed the barrier.");
            } catch (Exception e) {
                e.printStackTrace();
            }
        };

        // ৩টি থ্রেড চালান
        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        Thread t3 = new Thread(task);

        t1.start();
        t2.start();
        t3.start();
    }
}

আউটপুট:

  1. তিনটি থ্রেড ব্যারিয়ারে পৌঁছায়।
  2. ব্যারিয়ার অ্যাকশন (Runnable) চালানো হয়।
  3. থ্রেডগুলো ব্যারিয়ার পার হয়।

২. Phaser

Phaser হলো একটি নমনীয় এবং ডাইনামিক সিঙ্ক্রোনাইজেশন টুল। এটি CyclicBarrier এবং CountDownLatch এর চেয়ে বেশি কার্যকর, কারণ এটি ডাইনামিক পার্টিসিপেশন সমর্থন করে।

বৈশিষ্ট্য:

  1. একাধিক পর্যায় (Phase) পরিচালনা করতে পারে।
  2. ডাইনামিকভাবে থ্রেড যোগ এবং অপসারণ করা যায়।
  3. প্রতিটি পর্যায় সম্পন্ন হওয়ার পরে পরবর্তী পর্যায়ে যেতে পারে।

Phaser উদাহরণ:

import java.util.concurrent.Phaser;

public class PhaserExample {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(1); // মূল থ্রেডসহ ১টি রেজিস্টার্ড পার্টি

        Runnable task = (phase) -> {
            int currentPhase = phaser.getPhase();
            System.out.println(Thread.currentThread().getName() + " is in phase " + currentPhase);
            phaser.arriveAndAwaitAdvance(); // পর্যায় শেষ করুন এবং অপেক্ষা করুন
        };

        // নতুন থ্রেড তৈরি এবং রেজিস্টার
        Thread t1 = new Thread(() -> {
            phaser.register(); // নতুন পার্টি রেজিস্টার
            task.run();
            task.run();
        }, "Thread-1");

        Thread t2 = new Thread(() -> {
            phaser.register();
            task.run();
            task.run();
        }, "Thread-2");

        t1.start();
        t2.start();

        // মূল থ্রেডে কাজ চালান
        for (int i = 0; i < 2; i++) {
            System.out.println("Main thread is in phase " + phaser.getPhase());
            phaser.arriveAndAwaitAdvance(); // পর্যায় শেষ করুন এবং অপেক্ষা করুন
        }

        phaser.arriveAndDeregister(); // মূল থ্রেড অপসারণ
    }
}

আউটপুট:

  • প্রতিটি থ্রেড প্রতিটি পর্যায় সম্পন্ন করে পরবর্তী পর্যায়ে যায়।
  • মূল থ্রেড ফাইনাল পর্যায়ে অপসারণ করে।

CyclicBarrier এবং Phaser এর তুলনা

বৈশিষ্ট্যCyclicBarrierPhaser
পর্যায় (Phase)একক পর্যায় পরিচালনা করতে পারেএকাধিক পর্যায় পরিচালনা করতে পারে
ডাইনামিক থ্রেড যোগডাইনামিক থ্রেড যোগ করা যায় নাথ্রেড ডাইনামিকভাবে যোগ/অপসারণ করা যায়
ব্যবহারনির্দিষ্ট সংখ্যক থ্রেডের জন্য অপেক্ষা করতেফ্লেক্সিবল এবং জটিল সিঙ্ক্রোনাইজেশনের জন্য

ব্যবহার ক্ষেত্র

  1. CyclicBarrier:
    • একাধিক থ্রেড একত্রে কাজ শুরু করতে হবে।
    • নির্দিষ্ট কাজের জন্য সীমিত সংখ্যক থ্রেড।
  2. Phaser:
    • ডাইনামিক এবং জটিল সিঙ্ক্রোনাইজেশন প্রয়োজন।
    • পর্যায়ভিত্তিক কাজ সম্পন্ন করা।

  • CyclicBarrier সহজ এবং সুনির্দিষ্ট কাজের জন্য উপযুক্ত যেখানে থ্রেডের সংখ্যা স্থির।
  • Phaser আরো নমনীয় এবং পর্যায়ভিত্তিক বা ডাইনামিক থ্রেড ব্যবস্থাপনার জন্য কার্যকর।

এই টুলসগুলো সঠিকভাবে ব্যবহারে মাল্টিথ্রেডিংয়ের জটিলতা অনেকাংশে কমানো সম্ভব।

Content added By
Promotion

Are you sure to start over?

Loading...