BlockingQueue এবং LinkedBlockingQueue ক্লাসগুলি java.util.concurrent প্যাকেজের অংশ, যা concurrent programming-এ বিশেষভাবে ব্যবহৃত হয়। এগুলি মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলিতে থ্রেডের মধ্যে সুরক্ষিত এবং সিঙ্ক্রোনাইজড ডেটা আদান-প্রদান সহজ করে তোলে। এগুলি এক্সিকিউটর এবং থ্রেড পুলে ব্যবহৃত হয়, যেখানে থ্রেডগুলির মধ্যে কাজের ভাগবাটোয়ারা এবং সিঙ্ক্রোনাইজেশন অত্যন্ত গুরুত্বপূর্ণ।
BlockingQueue এর ধারণা
BlockingQueue একটি ইন্টারফেস যা কিউ (Queue) ডেটা স্ট্রাকচার নির্ধারণ করে, এবং এতে ব্লকিং অপারেশন থাকে, যা মানে যদি কিউ ফাঁকা থাকে বা পূর্ণ থাকে, তখন কোন থ্রেড উপাদান গ্রহণ বা যোগ করতে পারবে না যতক্ষণ না সেটা সম্ভব হয়।
BlockingQueue এর প্রধান সুবিধা হলো, এটি producer-consumer problem সমাধান করতে সহায়ক, যেখানে একটি থ্রেড কাজ যোগ করে (producer) এবং অন্য থ্রেড সেই কাজ গ্রহণ করে (consumer)।
BlockingQueue এর মূল মেথডসমূহ:
put(E e):- কিউতে একটি উপাদান যোগ করতে ব্যবহৃত হয়। যদি কিউ পূর্ণ থাকে, তাহলে এটি থ্রেডটিকে ব্লক করে যতক্ষণ না কিউতে জায়গা হয়।
take():- কিউ থেকে একটি উপাদান গ্রহণ করতে ব্যবহৃত হয়। যদি কিউ ফাঁকা থাকে, তাহলে এটি থ্রেডটিকে ব্লক করে যতক্ষণ না কিউতে একটি উপাদান থাকে।
offer(E e):- কিউতে একটি উপাদান যোগ করতে চেষ্টা করে, কিন্তু কিউ পূর্ণ থাকলে এটি false রিটার্ন করে এবং থ্রেড ব্লক হয় না।
poll():- কিউ থেকে একটি উপাদান গ্রহণ করে, কিন্তু কিউ ফাঁকা থাকলে এটি null রিটার্ন করে এবং থ্রেড ব্লক হয় না।
LinkedBlockingQueue এর ধারণা
LinkedBlockingQueue হল BlockingQueue ইন্টারফেসের একটি বাস্তবায়ন, যা একটি linked list ভিত্তিক কিউ। এটি FIFO (First-In-First-Out) নিয়ম অনুসারে কাজ করে, অর্থাৎ প্রথমে যোগ করা উপাদানটি প্রথমে বের হয়ে যাবে।
LinkedBlockingQueue প্রায়ই ব্যবহৃত হয় যখন অনেক producer-consumer threads একসাথে কাজ করছে এবং যেখানে কিউ আকার ডাইনামিক হতে পারে, অর্থাৎ এটি থ্রেড-সেফ এবং ব্লকিং কিউ অপারেশন সহজে পরিচালনা করতে পারে।
LinkedBlockingQueue এর বৈশিষ্ট্য:
- Capacity: এটি একটি ঐচ্ছিক capacity (ধারণক্ষমতা) নির্ধারণ করতে পারে, যদি কিউ পূর্ণ থাকে তবে এটি ব্লক করবে যতক্ষণ না সেখানে জায়গা তৈরি হয়।
- Thread-Safety: এটি থ্রেড-সেফ। একাধিক থ্রেড নিরাপদভাবে কিউতে উপাদান যোগ করতে এবং গ্রহণ করতে পারে।
- Blocking Operations: ব্লকিং অপারেশনগুলির মাধ্যমে থ্রেডগুলি কিউতে উপাদান গ্রহণ বা যোগ করার জন্য সিঙ্ক্রোনাইজড থাকে।
LinkedBlockingQueue এর ব্যবহার উদাহরণ:
import java.util.concurrent.LinkedBlockingQueue;
public class LinkedBlockingQueueExample {
public static void main(String[] args) throws InterruptedException {
// একটি LinkedBlockingQueue তৈরি করা (capacity 10)
LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);
// Producer thread
Thread producer = new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
queue.put(i); // কিউতে উপাদান যোগ করা
System.out.println("Produced: " + i);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
// Consumer thread
Thread consumer = new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
int value = queue.take(); // কিউ থেকে উপাদান গ্রহণ
System.out.println("Consumed: " + value);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
producer.start(); // Producer thread শুরু করা
consumer.start(); // Consumer thread শুরু করা
producer.join(); // Producer thread শেষ হওয়া পর্যন্ত অপেক্ষা করা
consumer.join(); // Consumer thread শেষ হওয়া পর্যন্ত অপেক্ষা করা
}
}
Output:
Produced: 0
Produced: 1
Consumed: 0
Produced: 2
Consumed: 1
Produced: 3
Consumed: 2
Produced: 4
Consumed: 3
Produced: 5
Consumed: 4
Produced: 6
Consumed: 5
Produced: 7
Consumed: 6
Produced: 8
Consumed: 7
Produced: 9
Consumed: 8
Consumed: 9
ব্যাখ্যা:
- এখানে একটি
LinkedBlockingQueueতৈরি করা হয়েছে যার ধারণক্ষমতা ১০। - Producer thread কিউতে উপাদান যোগ করে, এবং Consumer thread কিউ থেকে উপাদান গ্রহণ করে।
put()মেথড producer থ্রেডকে ব্লক করে যদি কিউ পূর্ণ থাকে।take()মেথড consumer থ্রেডকে ব্লক করে যদি কিউ খালি থাকে।
BlockingQueue এবং LinkedBlockingQueue এর মধ্যে পার্থক্য:
| Property | BlockingQueue | LinkedBlockingQueue |
|---|---|---|
| Interface vs Implementation | Interface | Concrete implementation of BlockingQueue |
| Capacity | No capacity limit by default (can be defined) | Can define a capacity limit (default is Integer.MAX_VALUE) |
| Thread Safety | Thread-safe, allows concurrent access | Thread-safe, allows concurrent access |
| Usage | Can be implemented by various classes (e.g., ArrayBlockingQueue) | Typically used when elements are inserted and removed in FIFO order |
| Blocking Operations | Block on insert or remove when full or empty | Block on insert or remove when full or empty |
BlockingQueueএবংLinkedBlockingQueueক্লাসগুলি concurrent programming-এ ব্যবহৃত হয় যেখানে থ্রেডগুলির মধ্যে সিঙ্ক্রোনাইজড উপাদান আদান-প্রদান প্রয়োজন হয়।LinkedBlockingQueueএকটি সাধারণ বাস্তবায়ন, যা ব্লকিং অপারেশন এবং থ্রেড-সেফ ডেটা প্রক্রিয়া সরবরাহ করে। এটি FIFO নিয়মে কাজ করে এবং বড় থ্রেড-পুল ব্যবস্থার জন্য কার্যকর।- এই ক্লাসগুলি মাল্টিথ্রেডেড অ্যাপ্লিকেশনে যেমন producer-consumer problem সমাধানে ব্যবহৃত হয় এবং থ্রেডগুলির মধ্যে নিরাপদ ডেটা আদান-প্রদান নিশ্চিত করে।
Read more