BlockingQueue এর ধারণা এবং প্রয়োগ

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

342

BlockingQueue হল একটি থ্রেড-সেফ কিউ, যা প্রযোজক-গ্রাহক (Producer-Consumer) প্যাটার্নে ব্যবহৃত হয়। এটি জাভার java.util.concurrent প্যাকেজের অংশ এবং থ্রেড সিঙ্ক্রোনাইজেশনের জন্য ব্লকিং অপারেশন প্রদান করে।


BlockingQueue এর বৈশিষ্ট্য

  1. থ্রেড-সেফ: একাধিক থ্রেড একসাথে একই কিউ ব্যবহার করতে পারে।
  2. ব্লকিং মেকানিজম:
    • যদি কিউ খালি থাকে, take() মেথড থ্রেডকে ব্লক করে রাখে যতক্ষণ না কোনো আইটেম যোগ করা হয়।
    • যদি কিউ পূর্ণ থাকে, put() মেথড থ্রেডকে ব্লক করে রাখে যতক্ষণ না কোনো স্থান খালি হয়।
  3. ইমপ্লিমেন্টেশন: এর অনেক ইমপ্লিমেন্টেশন রয়েছে:
    • ArrayBlockingQueue: নির্দিষ্ট আকারের কিউ।
    • LinkedBlockingQueue: লিংকড লিস্ট ব্যবহার করে।
    • PriorityBlockingQueue: অর্ডার্ড উপাদান সংরক্ষণ করে।
    • DelayQueue: ডিলেই অপারেশনের জন্য ব্যবহৃত হয়।

BlockingQueue এর মেথডসমূহ

  1. put(E e): কিউতে একটি উপাদান যোগ করে; যদি কিউ পূর্ণ হয়, এটি ব্লক করে।
  2. take(): কিউ থেকে একটি উপাদান নেয়; যদি কিউ খালি হয়, এটি ব্লক করে।
  3. offer(E e): একটি উপাদান যোগ করার চেষ্টা করে; তাৎক্ষণিক ব্যর্থ হলে false রিটার্ন করে।
  4. poll(): একটি উপাদান নেওয়ার চেষ্টা করে; কিউ খালি থাকলে null রিটার্ন করে।

BlockingQueue এর ব্যবহার: প্রযোজক-গ্রাহক উদাহরণ

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ProducerConsumerExample {

    public static void main(String[] args) {
        // ৫টি উপাদানের সীমা সহ একটি BlockingQueue তৈরি করা
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(5);

        // প্রযোজক থ্রেড
        Thread producer = new Thread(() -> {
            try {
                for (int i = 1; i <= 10; 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();
    }
}

BlockingQueue এর ব্যবহার: ফিক্সড থ্রেড পুল সহ উদাহরণ

import java.util.concurrent.*;

public class ThreadPoolWithBlockingQueue {

    public static void main(String[] args) {
        BlockingQueue<Runnable> taskQueue = new ArrayBlockingQueue<>(10);

        // ThreadPoolExecutor তৈরি করা
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                2, // কোর থ্রেড
                4, // সর্বাধিক থ্রেড
                60, // আইডল থ্রেডের জন্য অপেক্ষার সময়
                TimeUnit.SECONDS,
                taskQueue
        );

        // টাস্ক যোগ করা
        for (int i = 1; i <= 15; i++) {
            int taskNumber = i;
            executor.execute(() -> {
                System.out.println("Executing Task: " + taskNumber);
                try {
                    Thread.sleep(1000); // কাজ সম্পন্ন করা
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        executor.shutdown();
    }
}

BlockingQueue এর বিভিন্ন ইমপ্লিমেন্টেশন

১. ArrayBlockingQueue

  • নির্দিষ্ট আকারের।
  • প্রথমে ইনসার্ট, প্রথমে রিমুভ (FIFO)।
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(5);

২. LinkedBlockingQueue

  • ডায়নামিক আকারের।
  • বড় ডেটা সেটের জন্য উপযুক্ত।
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();

৩. PriorityBlockingQueue

  • উপাদানগুলিকে অর্ডার করে রাখে।
  • Comparator ব্যবহার করা যায়।
BlockingQueue<Integer> queue = new PriorityBlockingQueue<>();

৪. DelayQueue

  • উপাদানগুলোকে ডিলেই সময় পর্যন্ত হোল্ড করে।
  • Delayed ইন্টারফেস ব্যবহার করা হয়।
BlockingQueue<DelayedTask> queue = new DelayQueue<>();

BlockingQueue এর সুবিধা

  1. থ্রেড-সেফ: একাধিক থ্রেড একসাথে কাজ করতে পারে।
  2. ব্লকিং মেকানিজম: ব্যস্ত অপেক্ষা (busy-waiting) প্রতিরোধ করে।
  3. মাল্টি-থ্রেড প্রোগ্রামিংয়ে সহজ: প্রযোজক-গ্রাহক প্যাটার্ন সহজ করে।

BlockingQueue এর সীমাবদ্ধতা

  1. ফুল কিউ: যদি কিউ পূর্ণ হয়, তখন put() থ্রেডকে ব্লক করে।
  2. খালি কিউ: যদি কিউ খালি থাকে, তখন take() থ্রেডকে ব্লক করে।
  3. ডিলেইড প্রসেসিং: বড় ডেটা সেটের জন্য অপেক্ষা সময় বাড়তে পারে।

BlockingQueue হল জাভার কনকারেন্সি মডেলের একটি অত্যন্ত কার্যকর ডেটা স্ট্রাকচার, যা থ্রেড-সেফ এবং ব্লকিং মেকানিজম সমর্থন করে। এটি প্রযোজক-গ্রাহক প্যাটার্ন, থ্রেড পুল, এবং ডেলেইড প্রসেসিং এর মত কাজ সহজ করে। সঠিক ইমপ্লিমেন্টেশন এবং অপারেশন চয়নের মাধ্যমে এটি মাল্টি-থ্রেডেড প্রোগ্রামিংকে আরও কার্যকর ও উন্নত করে।

Content added By
Promotion

Are you sure to start over?

Loading...