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 এর তুলনা
| বৈশিষ্ট্য | ArrayBlockingQueue | LinkedBlockingQueue |
|---|---|---|
| মেমোরি স্ট্রাকচার | ফিক্সড সাইজ অ্যারে | লিঙ্কড লিস্ট |
| ডেটা সাইজ | পূর্বনির্ধারিত (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();
}
}
ArrayBlockingQueue: ছোট এবং ফিক্সড সাইজের ডেটার জন্য কার্যকর।LinkedBlockingQueue: বড় এবং ডাইনামিক সাইজের ডেটার জন্য উপযুক্ত।- উভয়ই প্রযোজক-গ্রাহক প্যাটার্নে থ্রেড সিঙ্ক্রোনাইজেশনের জন্য কার্যকর এবং থ্রেড-সেফ।
উপযুক্ত প্রয়োজন অনুযায়ী এই দুটি কিউ ব্যবহার করে মাল্টিথ্রেডেড প্রোগ্রামিং সহজ ও দক্ষ করা যায়।
Read more