Java NIO তে Pipe একটি শক্তিশালী কনসেপ্ট, যা দুইটি থ্রেডের মধ্যে ডেটা আদান-প্রদান করার জন্য ব্যবহৃত হয়। Pipe.SinkChannel এবং Pipe.SourceChannel দুটি কম্পোনেন্ট, যা একে অপরের সাথে ডেটা পাঠানো এবং গ্রহণের কাজ করে। এটি বিশেষত Inter-thread Communication (থ্রেডের মধ্যে যোগাযোগ) এর জন্য ব্যবহৃত হয় এবং blocking বা non-blocking পদ্ধতিতে কাজ করতে পারে।
Pipe.SinkChannel ডেটা লিখতে ব্যবহৃত হয় এবং Pipe.SourceChannel ডেটা পড়তে ব্যবহৃত হয়। এই চ্যানেলগুলি একটি Pipe এর অংশ হিসেবে কাজ করে এবং তাদের মধ্যে ডেটা একথেকে অন্যথায় স্থানান্তরিত হয়। এগুলি ইন্টার-থ্রেড যোগাযোগের জন্য খুবই উপকারী, কারণ এগুলি থ্রেডগুলোকে একে অপরের সাথে সংযুক্ত করতে সক্ষম।
Pipe.SinkChannel এবং Pipe.SourceChannel এর কার্যপ্রণালী
- Pipe.SinkChannel: এটি একটি চ্যানেল যা ডেটা লিখতে ব্যবহৃত হয়। এটি ডেটা পিপে প্রেরণ করে এবং SourceChannel দ্বারা গ্রহণ করা হয়।
- Pipe.SourceChannel: এটি একটি চ্যানেল যা ডেটা পড়তে ব্যবহৃত হয়। এটি পিপে লিখিত ডেটা গ্রহণ করে এবং প্রয়োজনীয় প্রক্রিয়া চালায়।
একটি সাধারণ পাইপের মধ্যে, একটি থ্রেড SinkChannel এ ডেটা লেখে এবং অন্য একটি থ্রেড সেই ডেটা SourceChannel এর মাধ্যমে পড়ে। এতে, থ্রেডগুলোর মধ্যে সঠিকভাবে ডেটা আদান-প্রদান করা সম্ভব হয়।
উদাহরণ: Pipe.SinkChannel এবং Pipe.SourceChannel এর মাধ্যমে ডেটা আদান-প্রদান
এখানে একটি উদাহরণ দেওয়া হয়েছে যেখানে Pipe.SinkChannel এবং Pipe.SourceChannel ব্যবহার করে দুটি থ্রেডের মধ্যে ডেটা আদান-প্রদান করা হচ্ছে।
উদাহরণ: Pipe ব্যবহার করে ডেটা লেখা এবং পড়া
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class PipeExample {
public static void main(String[] args) throws IOException {
// Create a pipe
Pipe pipe = Pipe.open();
// Thread to write data to SinkChannel
Thread writerThread = new Thread(() -> {
Pipe.SinkChannel sinkChannel = pipe.sink();
String message = "Hello from SinkChannel!";
ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
try {
// Write data to the SinkChannel
while (buffer.hasRemaining()) {
sinkChannel.write(buffer);
}
System.out.println("Data written to SinkChannel.");
} catch (IOException e) {
e.printStackTrace();
}
});
// Thread to read data from SourceChannel
Thread readerThread = new Thread(() -> {
Pipe.SourceChannel sourceChannel = pipe.source();
ByteBuffer buffer = ByteBuffer.allocate(1024);
try {
// Read data from the SourceChannel
int bytesRead = sourceChannel.read(buffer);
while (bytesRead != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear();
bytesRead = sourceChannel.read(buffer);
}
System.out.println("\nData read from SourceChannel.");
} catch (IOException e) {
e.printStackTrace();
}
});
// Start the threads
writerThread.start();
readerThread.start();
// Wait for threads to finish
try {
writerThread.join();
readerThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- Pipe.open(): পাইপ তৈরি করার জন্য
Pipe.open()মেথড ব্যবহার করা হয়। এটি একটিPipeঅবজেক্ট তৈরি করে, যার দুটি অংশ থাকে: SinkChannel এবং SourceChannel। - SinkChannel: প্রথম থ্রেড
SinkChannelএর মাধ্যমে একটি বার্তা লেখে। এটিByteBufferব্যবহার করে একটি স্ট্রিং ডেটা পিপে লিখে। - SourceChannel: দ্বিতীয় থ্রেড
SourceChannelএর মাধ্যমে পিপে থেকে ডেটা পড়ে এবং ডেটার আউটপুট প্রিন্ট করে। - ByteBuffer:
ByteBufferডেটা স্থানান্তরের জন্য ব্যবহৃত হয়। এটি ডেটাকে পিপে পাঠানোর জন্য লেখে এবং পরে পড়ে নেয়।
এখানে দুটি থ্রেড রয়েছে: একটি থ্রেড ডেটা লিখে (SinkChannel), এবং অন্য থ্রেড সেই ডেটা পড়ে (SourceChannel)। এর মাধ্যমে ডেটা একটি থ্রেড থেকে অন্যথায় স্থানান্তরিত হয়।
Pipe.SinkChannel এবং Pipe.SourceChannel এর ব্যবহারিক সুবিধা
- Inter-thread Communication: পাইপ ব্যবহার করে একাধিক থ্রেডের মধ্যে দ্রুত এবং কার্যকরীভাবে ডেটা আদান-প্রদান করা যায়।
- Non-blocking I/O:
SinkChannelএবংSourceChannelনন-ব্লকিং I/O অপারেশন করতে সক্ষম, যার ফলে সিস্টেমের অন্যান্য থ্রেডগুলি কাজ চালিয়ে যেতে পারে। - সোজা বাস্তবায়ন: পাইপের মাধ্যমে ডেটা পাঠানো এবং গ্রহণ করা খুবই সহজ, এবং এটি সিস্টেমের I/O কার্যক্রমে কমপ্লেক্সিটি কমায়।
Java NIO এর Pipe.SinkChannel এবং Pipe.SourceChannel দুটি চ্যানেল খুবই শক্তিশালী টুল যা থ্রেডগুলির মধ্যে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। এগুলি non-blocking I/O অপারেশন পরিচালনা করতে সক্ষম এবং সহজে ডেটা পাঠানোর জন্য ব্যবহৃত হয়। Java NIO তে পাইপের মাধ্যমে একাধিক থ্রেডের মধ্যে ডেটা স্থানান্তর করা সহজ এবং কার্যকরী, যা অধিক কর্মক্ষমতা এবং পারফরম্যান্স নিশ্চিত করে।
Read more