Piped Streams হল জাভা I/O API-তে একটি বিশেষ ধরনের স্ট্রিম যা এক থ্রেড থেকে অন্য থ্রেডে ডেটা পাঠানোর জন্য ব্যবহৃত হয়। এটি থ্রেডগুলির মধ্যে inter-thread communication (ITC) করার একটি কার্যকরী উপায়। PipedInputStream এবং PipedOutputStream ক্লাসগুলি এটি সম্ভব করে তোলে।
এটি একটি থ্রেডের আউটপুট অন্য একটি থ্রেডের ইনপুট হিসাবে কাজ করে। পিপড স্ট্রিমগুলি মূলত producer-consumer model এর মতো কাজ করে, যেখানে এক থ্রেড ডেটা তৈরি করে এবং অন্য থ্রেড সেই ডেটা গ্রহণ করে।
Piped Streams এর ধারণা
PipedInputStream: এটি একটি ইনপুট স্ট্রিম যা অন্য থ্রেডের আউটপুট থেকে ডেটা পড়ে।PipedOutputStream: এটি একটি আউটপুট স্ট্রিম যা ডেটা অন্য থ্রেডে পাঠাতে ব্যবহার হয়।
Inter-Thread Communication with Piped Streams
এটি সাধারণত Producer-Consumer প্যাটার্নের মধ্যে ব্যবহৃত হয় যেখানে এক থ্রেড ডেটা তৈরি করে এবং অন্য থ্রেড সেই ডেটা ব্যবহার করে।
Piped Streams এর কাজের পদ্ধতি
- Producer Thread: ডেটা তৈরি এবং
PipedOutputStreamএর মাধ্যমেPipedInputStreamএ লিখে। - Consumer Thread:
PipedInputStreamথেকে ডেটা পড়ে এবং প্রক্রিয়া করে।
Piped Streams উদাহরণ: Inter-Thread Communication
এখানে একটি Producer এবং Consumer থ্রেডের উদাহরণ দেখানো হয়েছে যেখানে PipedOutputStream এবং PipedInputStream ব্যবহার করা হয়েছে।
Producer-Consumer Example using Piped Streams
import java.io.*;
import java.util.concurrent.*;
class Producer extends Thread {
private PipedOutputStream out;
public Producer(PipedOutputStream out) {
this.out = out;
}
@Override
public void run() {
try {
String[] messages = {"Hello", "World", "from", "Producer", "Thread!"};
for (String message : messages) {
out.write(message.getBytes());
out.write("\n".getBytes()); // new line for each message
System.out.println("Producer: Sent message -> " + message);
Thread.sleep(1000); // Sleep to simulate processing time
}
out.close(); // Close the PipedOutputStream after sending all data
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer extends Thread {
private PipedInputStream in;
public Consumer(PipedInputStream in) {
this.in = in;
}
@Override
public void run() {
try {
int data;
while ((data = in.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class PipedStreamExample {
public static void main(String[] args) {
try {
PipedOutputStream outputStream = new PipedOutputStream();
PipedInputStream inputStream = new PipedInputStream(outputStream);
// Create and start the Producer thread
Producer producer = new Producer(outputStream);
producer.start();
// Create and start the Consumer thread
Consumer consumer = new Consumer(inputStream);
consumer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- Producer Thread:
- PipedOutputStream ব্যবহার করে ডেটা তৈরি করে এবং PipedInputStream এর মাধ্যমে পাঠানো হয়।
- এই থ্রেডটি প্রতি সেকেন্ডে একটি নতুন মেসেজ পাঠায় এবং
Thread.sleep(1000)ব্যবহার করে প্রতিটি বার্তা পাঠানোর মধ্যে দেরি যোগ করে।
- Consumer Thread:
- PipedInputStream ব্যবহার করে ডেটা পড়ে এবং কনসোলে আউটপুট প্রিন্ট করে।
- এটি PipedOutputStream থেকে ডেটা গ্রহণ করে এবং প্রদর্শন করে।
- PipedStream:
PipedOutputStreamএবংPipedInputStreamএকে অপরের সাথে সংযুক্ত থাকে এবং পিপড স্ট্রিমে ডেটা স্থানান্তরিত হয়।
আউটপুট:
Producer: Sent message -> Hello
Producer: Sent message -> World
Producer: Sent message -> from
Producer: Sent message -> Producer
Producer: Sent message -> Thread!
Hello
World
from
Producer
Thread!
Piped Streams এর সুবিধা
- Efficient Inter-Thread Communication:
- এটি থ্রেডগুলির মধ্যে কার্যকরী এবং সোজা ডেটা ট্রান্সফার নিশ্চিত করে, বিশেষ করে যখন একটি থ্রেড ডেটা তৈরি করে এবং অন্যটি সেই ডেটা গ্রহণ করে।
- Producer-Consumer Model:
- Piped Streams বিশেষভাবে Producer-Consumer মডেল ব্যবহার করে ডেটা প্রক্রিয়া করার জন্য উপযুক্ত। একজন Producer থ্রেড ডেটা তৈরি করে এবং Consumer থ্রেড সেই ডেটা ব্যবহার করে।
- Low-Level Communication:
- এটি একটি কম-স্তরের ইন্টার-থ্রেড যোগাযোগ পদ্ধতি যা নেটওয়ার্ক বা ফাইল I/O এর তুলনায় দ্রুত এবং কম খরচে কাজ করে।
Piped Streams এর সীমাবদ্ধতা
- Blocking Behavior:
PipedInputStreamএবংPipedOutputStreamব্লকিং স্ট্রিম হতে পারে, অর্থাৎ যদি পিপড আউটপুট স্ট্রিমে ডেটা না থাকে, তবে ইনপুট থ্রেড ব্লক হয়ে যাবে।
- Error Handling:
- এই ধরনের স্ট্রিমে IOException বা অন্যান্য প্রবাহ সম্পর্কিত ত্রুটি মোকাবেলা করতে হবে, বিশেষ করে যদি এক থ্রেড ভুলে স্ট্রিম বন্ধ করে দেয়।
- Synchronization:
- Piped Streams এর মধ্যে ডেটা পাঠানোর এবং গ্রহণ করার সময় synchronization প্রয়োজন হতে পারে, বিশেষত যদি একাধিক থ্রেড একসাথে কাজ করে।
Piped Streams জাভায় Inter-Thread Communication (ITC) এর জন্য একটি শক্তিশালী টুল। এটি Producer-Consumer মডেলের মধ্যে থ্রেডগুলির মধ্যে ডেটা আদান প্রদান করতে সক্ষম। PipedOutputStream এবং PipedInputStream ক্লাসগুলি থ্রেডগুলির মধ্যে ডেটা দ্রুত এবং কার্যকরভাবে স্থানান্তর করার জন্য ব্যবহৃত হয়। যদিও এটি ব্লকিং স্ট্রিম হতে পারে, তবে এটি সঠিকভাবে ব্যবহৃত হলে একাধিক থ্রেডের মধ্যে দ্রুত এবং কার্যকরী ডেটা স্থানান্তর নিশ্চিত করে।