Piped Streams হল Java I/O API এর একটি বিশেষ প্রকার যা দুটি থ্রেডের মধ্যে ডেটা স্থানান্তর করতে ব্যবহৃত হয়। এটি একটি PipedInputStream এবং PipedOutputStream ব্যবহার করে যেখানে একটি থ্রেড ডেটা লেখে এবং অন্য থ্রেড সেই ডেটা পড়ে।
Piped Streams মূলত এক থ্রেড থেকে অন্য থ্রেডে ডেটা পাস করার জন্য ডিজাইন করা হয়। একে PipedInputStream বা PipedReader (character streams এর জন্য) এবং PipedOutputStream বা PipedWriter (character streams এর জন্য) ক্লাসের মাধ্যমে ব্যবহৃত হয়।
Piped Streams দুটি প্রধান কাজ সম্পাদন করতে পারে:
- ডেটা পাঠানো: একটি থ্রেড ডেটা পাঠাতে পারে অন্য থ্রেডের কাছে।
- ডেটা গ্রহণ করা: অন্য থ্রেড সেই ডেটা গ্রহণ করে।
Piped Streams এর সুবিধা:
- Thread Communication: Piped Streams থ্রেডগুলোর মধ্যে যোগাযোগের একটি উপায় সরবরাহ করে।
- Real-time Data Transfer: এটি মূলত real-time ডেটা স্থানান্তরের জন্য উপযুক্ত।
- Efficient Communication: এটি কম সময়ের মধ্যে দ্রুত ডেটা পাঠানোর জন্য ডিজাইন করা।
Piped Streams এর উদাহরণ
এখানে একটি Producer-Consumer উদাহরণ দেয়া হবে, যেখানে একটি থ্রেড Producer হিসেবে কাজ করবে এবং অন্য থ্রেড Consumer হিসেবে কাজ করবে। Producer ডেটা PipedOutputStream মাধ্যমে লিখবে এবং Consumer সেই ডেটা PipedInputStream মাধ্যমে পড়বে।
১. Piped Streams ব্যবহার করে Producer-Consumer উদাহরণ
import java.io.*;
import java.util.concurrent.*;
class Producer extends Thread {
private PipedOutputStream outputStream;
public Producer(PipedOutputStream outputStream) {
this.outputStream = outputStream;
}
@Override
public void run() {
try {
String[] data = {"Java", "Tuples", "and", "Piped", "Streams"};
for (String word : data) {
outputStream.write(word.getBytes());
outputStream.write(' '); // space between words
System.out.println("Produced: " + word);
Thread.sleep(500); // Simulate time to produce data
}
outputStream.close();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer extends Thread {
private PipedInputStream inputStream;
public Consumer(PipedInputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public void run() {
try {
int data;
StringBuilder builder = new StringBuilder();
while ((data = inputStream.read()) != -1) {
builder.append((char) data); // Convert byte to character
if (data == ' ') {
System.out.println("Consumed: " + builder.toString().trim());
builder.setLength(0); // Reset the StringBuilder for the next word
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class PipedStreamsExample {
public static void main(String[] args) throws IOException {
// Create Piped streams
PipedOutputStream producerOutput = new PipedOutputStream();
PipedInputStream consumerInput = new PipedInputStream(producerOutput);
// Create Producer and Consumer threads
Producer producer = new Producer(producerOutput);
Consumer consumer = new Consumer(consumerInput);
// Start threads
producer.start();
consumer.start();
}
}
ব্যাখ্যা:
- Producer থ্রেড
PipedOutputStreamব্যবহার করে কিছু শব্দ উৎপাদন করে এবং একটি পাইপে লেখে। - Consumer থ্রেড
PipedInputStreamব্যবহার করে পাইপ থেকে ডেটা পড়ে এবং আউটপুট হিসাবে প্রক্রিয়া করে। PipedOutputStreamএবংPipedInputStreamএকে অপরের সাথে সংযুক্ত থাকে। Producer থ্রেড লেখার পর Consumer থ্রেড তা পড়ে।
আউটপুট:
Produced: Java
Consumed: Java
Produced: Tuples
Consumed: Tuples
Produced: and
Consumed: and
Produced: Piped
Consumed: Piped
Produced: Streams
Consumed: Streams
Piped Streams এর কার্যপ্রণালী
- Producer Thread:
PipedOutputStreamব্যবহার করে ডেটা লেখে।- ডেটা লেখার সময় কিছু সময়ের জন্য
Thread.sleep(500)ব্যবহার করা হয়েছে, যাতে Consumer থ্রেড ডেটা পড়তে পারে।
- Consumer Thread:
PipedInputStreamব্যবহার করে ডেটা পড়ে এবং আউটপুট প্রদর্শন করে।read()মেথড দ্বারা প্রতিটি বাইট পড়ে এবং সেটি কনভার্ট করে আউটপুট হিসেবে প্রদর্শন করে।
Piped Streams এর ব্যবহার:
1. Thread Communication
- Piped Streams বিভিন্ন থ্রেডের মধ্যে দ্রুত এবং কার্যকরীভাবে ডেটা স্থানান্তরের জন্য ব্যবহৃত হয়।
2. Real-Time Data Processing
- যখন ডেটা প্রক্রিয়াকরণ real-time প্রয়োজন হয়, যেমন Producer-Consumer প্যাটার্নে, তখন Piped Streams খুব কার্যকরী হতে পারে।
3. Data Streaming
- বড় ডেটা ব্লক বা লাইভ ডেটা প্রক্রিয়াকরণের জন্য
PipedOutputStreamএবংPipedInputStreamব্যবহার করে একাধিক থ্রেডের মধ্যে ডেটা প্রবাহিত করা যেতে পারে।
Piped Streams এর সীমাবদ্ধতা
- Thread Synchronization: যদি Producer থ্রেড এবং Consumer থ্রেড সঠিকভাবে সিঙ্ক্রোনাইজ না হয়, তবে ডেটা পড়া বা লেখার সময় deadlock হতে পারে।
- Buffer Size: Piped Streams সীমিত আকারের বাফার ব্যবহার করে, তাই একাধিক থ্রেড যদি খুব দ্রুত ডেটা লেখে এবং পড়ে, তবে এটি
PipedInputStreamবাPipedOutputStreamক্লাসের মধ্যে buffer overflow বা buffer underflow ঘটাতে পারে। - Blocking Behavior: Piped streams ব্লকিং মেথড ব্যবহার করে কাজ করে, যেমন
read()মেথড যা থ্রেডের জন্য ব্লক হতে পারে যখন পর্যন্ত ডেটা পাওয়া না যায়।
Piped Streams বিভিন্ন থ্রেডের মধ্যে ডেটা স্থানান্তরের জন্য একটি অত্যন্ত শক্তিশালী উপায়। Producer-Consumer প্যাটার্নে PipedOutputStream এবং PipedInputStream এর মাধ্যমে ডেটা দ্রুত এবং কার্যকরভাবে স্থানান্তরিত হয়। Tuples ব্যবহার করে ডেটা সংগঠিত এবং সঞ্চিত করা সহজ হয়, এবং Piped Streams এই ডেটা এক থ্রেড থেকে অন্য থ্রেডে স্থানান্তর করতে সাহায্য করে।
Read more