ArrayBlockingQueue এবং LinkedBlockingQueue এর ব্যবহার

BlockingQueue এবং Producer-Consumer Pattern - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

332

ArrayBlockingQueue এবং LinkedBlockingQueue হল জাভার কনকারেন্সি ফ্রেমওয়ার্কে BlockingQueue ইন্টারফেসের দুটি গুরুত্বপূর্ণ ইমপ্লিমেন্টেশন। এগুলো মূলত প্রযোজক-গ্রাহক (Producer-Consumer) প্যাটার্নে ব্যবহৃত হয় এবং থ্রেড সিঙ্ক্রোনাইজেশন নিশ্চিত করে।


১. ArrayBlockingQueue

ArrayBlockingQueue হলো একটি ফিক্সড সাইজের ব্লকিং কিউ, যেখানে একটি নির্দিষ্ট আকারের অ্যারে ব্যবহার করা হয়। এটি FIFO (First-In-First-Out) অর্ডারে কাজ করে।

বৈশিষ্ট্য:

  • পূর্বনির্ধারিত আকার (capacity)।
  • একসাথে একাধিক থ্রেড দ্বারা ব্যবহৃত হতে পারে।
  • থ্রেড-সেফ, যেখানে প্রযোজক এবং গ্রাহক লকিং মেকানিজম ব্যবহার করে।

উদাহরণ:

import java.util.concurrent.ArrayBlockingQueue;

public class ArrayBlockingQueueExample {
    public static void main(String[] args) {
        ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(5); // আকার 5

        // প্রযোজক থ্রেড
        Thread producer = new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    queue.put(i); // কিউতে মান যোগ করা
                    System.out.println("Produced: " + i);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // গ্রাহক থ্রেড
        Thread consumer = new Thread(() -> {
            try {
                while (true) {
                    Integer value = queue.take(); // কিউ থেকে মান নেওয়া
                    System.out.println("Consumed: " + value);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producer.start();
        consumer.start();
    }
}

২. LinkedBlockingQueue

LinkedBlockingQueue হলো একটি ডাইনামিক সাইজের ব্লকিং কিউ, যা লিঙ্কড লিস্ট ব্যবহার করে তৈরি করা হয়। এটি FIFO অর্ডারে কাজ করে এবং বড় আকারের ডেটা পরিচালনার জন্য উপযুক্ত।

বৈশিষ্ট্য:

  • ফিক্সড বা আনলিমিটেড সাইজ হতে পারে।
  • প্রযোজক এবং গ্রাহকের জন্য পৃথক লক ব্যবহার করে, ফলে লক প্রতিযোগিতা (lock contention) কম হয়।
  • বড় ডেটাসেট পরিচালনার জন্য কার্যকর।

উদাহরণ:

import java.util.concurrent.LinkedBlockingQueue;

public class LinkedBlockingQueueExample {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(3); // ফিক্সড আকার 3

        // প্রযোজক থ্রেড
        Thread producer = new Thread(() -> {
            try {
                queue.put("One");
                System.out.println("Produced: One");
                queue.put("Two");
                System.out.println("Produced: Two");
                queue.put("Three");
                System.out.println("Produced: Three");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // গ্রাহক থ্রেড
        Thread consumer = new Thread(() -> {
            try {
                while (true) {
                    String value = queue.take(); // কিউ থেকে মান নেওয়া
                    System.out.println("Consumed: " + value);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producer.start();
        consumer.start();
    }
}

৩. ArrayBlockingQueue এবং LinkedBlockingQueue এর তুলনা

বৈশিষ্ট্যArrayBlockingQueueLinkedBlockingQueue
মেমোরি স্ট্রাকচারফিক্সড সাইজ অ্যারেলিঙ্কড লিস্ট
ডেটা সাইজপূর্বনির্ধারিত (capacity বাধ্যতামূলক)ফিক্সড বা আনলিমিটেড
লক ব্যবস্থাপনাএকক লকপৃথক লক (প্রযোজক ও গ্রাহকের জন্য আলাদা)
পারফরম্যান্সছোট ডেটাসেটের জন্য কার্যকরবড় ডেটাসেটের জন্য কার্যকর
ব্যবহার ক্ষেত্রসীমিত ডেটা পরিচালনাবড় বা ডাইনামিক ডেটাসেট

৪. দুইটি একত্রে ব্যবহার: উদাহরণ

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class CombinedBlockingQueueExample {
    public static void main(String[] args) {
        ArrayBlockingQueue<Integer> arrayQueue = new ArrayBlockingQueue<>(3);
        LinkedBlockingQueue<String> linkedQueue = new LinkedBlockingQueue<>();

        // প্রযোজক থ্রেড (ArrayBlockingQueue)
        Thread arrayProducer = new Thread(() -> {
            try {
                for (int i = 1; i <= 3; i++) {
                    arrayQueue.put(i);
                    System.out.println("ArrayQueue Produced: " + i);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // গ্রাহক থ্রেড (ArrayBlockingQueue)
        Thread arrayConsumer = new Thread(() -> {
            try {
                while (!arrayQueue.isEmpty()) {
                    Integer value = arrayQueue.take();
                    System.out.println("ArrayQueue Consumed: " + value);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // প্রযোজক থ্রেড (LinkedBlockingQueue)
        Thread linkedProducer = new Thread(() -> {
            try {
                linkedQueue.put("One");
                linkedQueue.put("Two");
                linkedQueue.put("Three");
                System.out.println("LinkedQueue Produced: Three items");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // গ্রাহক থ্রেড (LinkedBlockingQueue)
        Thread linkedConsumer = new Thread(() -> {
            try {
                while (!linkedQueue.isEmpty()) {
                    String value = linkedQueue.take();
                    System.out.println("LinkedQueue Consumed: " + value);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // থ্রেড চালু করা
        arrayProducer.start();
        arrayConsumer.start();
        linkedProducer.start();
        linkedConsumer.start();
    }
}

  1. ArrayBlockingQueue: ছোট এবং ফিক্সড সাইজের ডেটার জন্য কার্যকর।
  2. LinkedBlockingQueue: বড় এবং ডাইনামিক সাইজের ডেটার জন্য উপযুক্ত।
  3. উভয়ই প্রযোজক-গ্রাহক প্যাটার্নে থ্রেড সিঙ্ক্রোনাইজেশনের জন্য কার্যকর এবং থ্রেড-সেফ।

উপযুক্ত প্রয়োজন অনুযায়ী এই দুটি কিউ ব্যবহার করে মাল্টিথ্রেডেড প্রোগ্রামিং সহজ ও দক্ষ করা যায়।

Content added By
Promotion

Are you sure to start over?

Loading...