Java NIO (New Input/Output) API হল এমন একটি শক্তিশালী I/O প্রযুক্তি, যা উন্নত I/O অপারেশন পরিচালনা করতে সাহায্য করে, বিশেষ করে যখন অনেক থ্রেড বা প্রসেস একসাথে কাজ করছে। Pipe ক্লাস Java NIO-র একটি বিশেষ উপাদান যা দুটি থ্রেডের মধ্যে ডেটা আদান-প্রদান করার জন্য ব্যবহৃত হয়। এটি থ্রেডের মধ্যে ডেটা যোগাযোগকে সহজ করে তোলে, বিশেষত যখন এক থ্রেড ডেটা উৎপন্ন করছে এবং অন্য থ্রেড সেই ডেটা ব্যবহার করছে।
Pipe ক্লাস সাধারণত থ্রেড-এন্টারকমিউনিকেশন বা থ্রেড-কোমিউনিকেশন পরিচালনা করতে ব্যবহৃত হয়। এটি মূলত Producer-consumer model-এ কাজ করতে সক্ষম, যেখানে একটি থ্রেড ডেটা প্রেরণ করে এবং অন্য থ্রেড সেই ডেটা গ্রহণ করে।
Pipe Class এর ধারণা
Pipe ক্লাস একটি সিঙ্ক্রোনাইজড পিপলাইন তৈরি করতে সাহায্য করে, যেখানে একটি থ্রেড একটি Pipe.SinkChannel ব্যবহার করে ডেটা লিখতে পারে এবং অন্য থ্রেড একটি Pipe.SourceChannel ব্যবহার করে সেই ডেটা পড়তে পারে। এটি ডেটার একে অপরের মধ্যে আদান-প্রদান নিশ্চিত করে, যেহেতু একটি থ্রেড একটি পাইপের মাধ্যমে অন্য থ্রেডের সাথে ডেটা শেয়ার করতে পারে।
Pipe এর উপাদানসমূহ
Java NIO তে একটি Pipe দুটি প্রধান অংশে বিভক্ত:
- Pipe.SinkChannel: এটি এমন একটি চ্যানেল যা ডেটা লেখার জন্য ব্যবহৃত হয়। এটি অন্য থ্রেডের কাছে ডেটা পাঠানোর জন্য দায়ী।
- Pipe.SourceChannel: এটি এমন একটি চ্যানেল যা ডেটা পড়ার জন্য ব্যবহৃত হয়। এটি সেই ডেটাকে গ্রহণ করে যা
SinkChannelদ্বারা পাঠানো হয়েছে।
Pipe এর কার্যপ্রণালী
- একটি SinkChannel থ্রেড থেকে ডেটা লিখে
Pipe-এ, যা পরে SourceChannel দ্বারা অন্য থ্রেডে পড়া হয়। - এটি এক থ্রেডের মধ্যে ডেটা প্রেরণ এবং অন্য থ্রেডের মধ্যে সেই ডেটা গ্রহণ করার জন্য কাজ করে।
Pipe Class এর প্রয়োজনীয়তা
Pipe ক্লাস Java NIO তে কিছু বিশেষ সুবিধা সরবরাহ করে যা অন্যান্য I/O প্রযুক্তি বা নেটওয়ার্ক কমিউনিকেশন থেকে আলাদা। এর প্রধান প্রয়োজনীয়তা এবং সুবিধাগুলো নিচে আলোচনা করা হলো:
১. থ্রেডের মধ্যে ডেটা আদান-প্রদান
Pipe ক্লাস বিশেষভাবে ব্যবহৃত হয় যখন একটি অ্যাপ্লিকেশন একাধিক থ্রেডের মধ্যে ডেটা ভাগ করে। যেমন, যখন একটি থ্রেড ডেটা উৎপন্ন করছে এবং অন্য একটি থ্রেড সেই ডেটা ব্যবহার করছে, তখন Pipe ক্লাসের মাধ্যমে সহজেই ডেটা আদান-প্রদান করা যায়।
২. Producer-consumer মডেল
Pipe সাধারণত Producer-consumer মডেলে ব্যবহৃত হয়, যেখানে একটি থ্রেড ডেটা উৎপন্ন করে এবং অন্য থ্রেড সেই ডেটা গ্রহন করে। SinkChannel ডেটা উৎপন্নকারী (Producer) হিসেবে কাজ করে, এবং SourceChannel ডেটা গ্রহণকারী (Consumer) হিসেবে কাজ করে।
৩. একই অ্যাপ্লিকেশনে থ্রেডের মধ্যে যোগাযোগ
Pipe ক্লাস অ্যাপ্লিকেশন লেভেলে থ্রেডের মধ্যে ডেটা যোগাযোগ নিশ্চিত করতে ব্যবহৃত হয়। এটি ব্যবহারের মাধ্যমে থ্রেড-থ্রেড ইন্টারকমিউনিকেশন সহজ হয় এবং পারফরম্যান্স বাড়ায়।
৪. কম রিসোর্স ব্যবহারে দ্রুত ডেটা আদান-প্রদান
Pipe ক্লাসের মাধ্যমে আপনি কম রিসোর্স ব্যবহার করে দ্রুত ডেটা আদান-প্রদান করতে পারবেন। এটি একটি সহজ, সিঙ্ক্রোনাইজড এবং ইন-মেমরি ডেটা প্রেরণ ব্যবস্থা যা অন্যান্য I/O প্রযুক্তির তুলনায় আরও কার্যকর।
উদাহরণ: Pipe Class এর ব্যবহার
এখানে একটি উদাহরণ দেওয়া হলো যেখানে একটি Pipe ব্যবহার করে দুটি থ্রেডের মধ্যে ডেটা আদান-প্রদান করা হয়েছে। একটি থ্রেড SinkChannel ব্যবহার করে ডেটা লেখবে এবং আরেকটি থ্রেড SourceChannel ব্যবহার করে ডেটা পড়বে।
import java.nio.channels.*;
import java.nio.*;
import java.io.*;
public class PipeExample {
public static void main(String[] args) throws IOException {
// Pipe তৈরি করা
Pipe pipe = Pipe.open();
// Thread 1: Data writing to SinkChannel
Thread writerThread = new Thread(new Runnable() {
public void run() {
try {
Pipe.SinkChannel sinkChannel = pipe.sink();
String data = "Hello from producer thread!";
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.clear();
buffer.put(data.getBytes());
buffer.flip();
// Data write
while (buffer.hasRemaining()) {
sinkChannel.write(buffer);
}
System.out.println("Data written to pipe.");
} catch (IOException e) {
e.printStackTrace();
}
}
});
// Thread 2: Data reading from SourceChannel
Thread readerThread = new Thread(new Runnable() {
public void run() {
try {
Pipe.SourceChannel sourceChannel = pipe.source();
ByteBuffer buffer = ByteBuffer.allocate(1024);
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 pipe.");
} catch (IOException e) {
e.printStackTrace();
}
}
});
// Threads start
writerThread.start();
readerThread.start();
}
}
ব্যাখ্যা:
- Pipe.open(): একটি নতুন Pipe তৈরি করা হয়, যা দুটি চ্যানেল
SinkChannelএবংSourceChannelধারণ করে। - Writer Thread: এটি একটি
SinkChannelব্যবহার করে ডেটা লিখছে। প্রথমে ডেটা একটিByteBufferতে রাখা হয়, এবং তারপরSinkChannelএর মাধ্যমে Pipe-এ লেখা হয়। - Reader Thread: এটি একটি
SourceChannelব্যবহার করে Pipe থেকে ডেটা পড়ছে।ByteBufferব্যবহার করে ডেটা পড়া হয় এবং প্রিন্ট করা হয়।
Pipe Class Java NIO এর একটি অত্যন্ত কার্যকরী উপাদান যা একাধিক থ্রেডের মধ্যে ডেটা আদান-প্রদান সহজ করে। এটি Producer-consumer model এ ব্যবহৃত হয়, যেখানে একটি থ্রেড ডেটা উৎপন্ন করে এবং অন্য থ্রেড সেই ডেটা গ্রহণ করে। Java NIO তে Pipe ব্যবহারের মাধ্যমে থ্রেড-থ্রেড যোগাযোগ দ্রুত এবং কম রিসোর্স খরচে সম্ভব হয়। এর মাধ্যমে ডেটা আদান-প্রদান একটি সিঙ্ক্রোনাইজড এবং নিরাপদ উপায়ে পরিচালনা করা যায়।
Read more