BlockingQueue হল একটি থ্রেড-সেফ কিউ, যা প্রযোজক-গ্রাহক (Producer-Consumer) প্যাটার্নে ব্যবহৃত হয়। এটি জাভার java.util.concurrent প্যাকেজের অংশ এবং থ্রেড সিঙ্ক্রোনাইজেশনের জন্য ব্লকিং অপারেশন প্রদান করে।
BlockingQueue এর বৈশিষ্ট্য
- থ্রেড-সেফ: একাধিক থ্রেড একসাথে একই কিউ ব্যবহার করতে পারে।
- ব্লকিং মেকানিজম:
- যদি কিউ খালি থাকে,
take()মেথড থ্রেডকে ব্লক করে রাখে যতক্ষণ না কোনো আইটেম যোগ করা হয়। - যদি কিউ পূর্ণ থাকে,
put()মেথড থ্রেডকে ব্লক করে রাখে যতক্ষণ না কোনো স্থান খালি হয়।
- যদি কিউ খালি থাকে,
- ইমপ্লিমেন্টেশন: এর অনেক ইমপ্লিমেন্টেশন রয়েছে:
ArrayBlockingQueue: নির্দিষ্ট আকারের কিউ।LinkedBlockingQueue: লিংকড লিস্ট ব্যবহার করে।PriorityBlockingQueue: অর্ডার্ড উপাদান সংরক্ষণ করে।DelayQueue: ডিলেই অপারেশনের জন্য ব্যবহৃত হয়।
BlockingQueue এর মেথডসমূহ
put(E e): কিউতে একটি উপাদান যোগ করে; যদি কিউ পূর্ণ হয়, এটি ব্লক করে।take(): কিউ থেকে একটি উপাদান নেয়; যদি কিউ খালি হয়, এটি ব্লক করে।offer(E e): একটি উপাদান যোগ করার চেষ্টা করে; তাৎক্ষণিক ব্যর্থ হলেfalseরিটার্ন করে।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 এর সুবিধা
- থ্রেড-সেফ: একাধিক থ্রেড একসাথে কাজ করতে পারে।
- ব্লকিং মেকানিজম: ব্যস্ত অপেক্ষা (busy-waiting) প্রতিরোধ করে।
- মাল্টি-থ্রেড প্রোগ্রামিংয়ে সহজ: প্রযোজক-গ্রাহক প্যাটার্ন সহজ করে।
BlockingQueue এর সীমাবদ্ধতা
- ফুল কিউ: যদি কিউ পূর্ণ হয়, তখন
put()থ্রেডকে ব্লক করে। - খালি কিউ: যদি কিউ খালি থাকে, তখন
take()থ্রেডকে ব্লক করে। - ডিলেইড প্রসেসিং: বড় ডেটা সেটের জন্য অপেক্ষা সময় বাড়তে পারে।
BlockingQueue হল জাভার কনকারেন্সি মডেলের একটি অত্যন্ত কার্যকর ডেটা স্ট্রাকচার, যা থ্রেড-সেফ এবং ব্লকিং মেকানিজম সমর্থন করে। এটি প্রযোজক-গ্রাহক প্যাটার্ন, থ্রেড পুল, এবং ডেলেইড প্রসেসিং এর মত কাজ সহজ করে। সঠিক ইমপ্লিমেন্টেশন এবং অপারেশন চয়নের মাধ্যমে এটি মাল্টি-থ্রেডেড প্রোগ্রামিংকে আরও কার্যকর ও উন্নত করে।
Content added By
Read more