Java NIO (New I/O) এর দুটি শক্তিশালী বৈশিষ্ট্য CompletionHandler এবং Future যা অ্যাসিঙ্ক্রোনাস I/O অপারেশন সম্পাদন করতে ব্যবহৃত হয়। Java 7 তে Asynchronous I/O (AIO) চালু হওয়ার পর, এই দুটি কনসেপ্ট Java NIO এর অংশ হিসেবে পরিচিতি পায় এবং I/O অপারেশনকে আরও কার্যকরী এবং স্কেলেবল করতে সাহায্য করে। এখানে আমরা আলোচনা করব CompletionHandler এবং Future মডেলের মাধ্যমে অ্যাসিঙ্ক্রোনাস I/O অপারেশন কীভাবে পরিচালনা করা যায় এবং তাদের সুবিধাগুলি।
CompletionHandler এর ধারণা
CompletionHandler হল একটি কাস্টম কলব্যাক হ্যান্ডলার যা Java NIO এর AsynchronousChannel (যেমন AsynchronousSocketChannel, AsynchronousFileChannel) এ I/O অপারেশন সম্পাদন করার পরে কলব্যাক প্রদান করতে ব্যবহৃত হয়। এটি অ্যাসিঙ্ক্রোনাস অপারেশনের ফলাফল এবং ত্রুটি হ্যান্ডলিং পরিচালনার জন্য একটি সুবিধাজনক উপায়।
CompletionHandler এর কাজ
CompletionHandler দুটি প্যারামিটার নেয়: একটিতে সফল ফলাফল এবং অন্যটিতে ত্রুটির কারণ। এটি সফল I/O অপারেশনের পরে কলব্যাকের মাধ্যমে ফলাফল প্রক্রিয়া করে এবং ত্রুটির ক্ষেত্রে ত্রুটির কারণ সনাক্ত করে।
CompletionHandler এর সাইনেচার
public interface CompletionHandler<V, A> {
void completed(V result, A attachment); // Called on success
void failed(Throwable exc, A attachment); // Called on failure
}
V: অপারেশনের ফলাফল (যেমন, ডেটা বা সংখ্যার মান)A: অ্যাটাচমেন্ট (যেমন, অতিরিক্ত কনটেক্সট বা ডেটা)
CompletionHandler ব্যবহার উদাহরণ
এখানে একটি AsynchronousSocketChannel এর মাধ্যমে CompletionHandler ব্যবহার করার উদাহরণ দেওয়া হলো:
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.net.InetSocketAddress;
import java.util.concurrent.Future;
public class AsyncClient {
public static void main(String[] args) throws Exception {
AsynchronousSocketChannel client = AsynchronousSocketChannel.open();
Future<Void> future = client.connect(new InetSocketAddress("localhost", 8080));
// Wait for connection to be established
future.get();
// Prepare data to send
ByteBuffer buffer = ByteBuffer.wrap("Hello, server!".getBytes());
// Asynchronously write data using CompletionHandler
client.write(buffer, null, new CompletionHandler<Integer, Void>() {
@Override
public void completed(Integer result, Void attachment) {
System.out.println("Data sent successfully!");
}
@Override
public void failed(Throwable exc, Void attachment) {
exc.printStackTrace();
}
});
}
}
এখানে, CompletionHandler দুটি মেথড completed() এবং failed() প্রদান করে, যা যথাক্রমে সফল এবং ব্যর্থ অপারেশনের জন্য কলব্যাক হ্যান্ডলিং করবে। এখানে write() অপারেশন অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয় এবং যখন ডেটা সফলভাবে পাঠানো হয়, তখন completed() মেথড কল করা হয়।
Future মডেলের ধারণা
Future Java 5-এ অন্তর্ভুক্ত একটি ইন্টারফেস যা একটি অ্যাসিঙ্ক্রোনাস অপারেশনের ফলাফল বা ত্রুটি ফেরত দেয়। এটি সাধারণত ExecutorService-এর সাথে ব্যবহৃত হয় এবং কোনো প্রক্রিয়ার শেষ না হওয়া পর্যন্ত থ্রেড ব্লক না করে ফলাফল পাওয়া সম্ভব করে তোলে। Future একটি একক মানের ফলাফল প্রদান করে, যা একটি অপারেশন শেষ হওয়ার পর রিটার্ন করা হয়।
Future এর সাইনেচার
public interface Future<V> {
V get() throws InterruptedException, ExecutionException; // Blocks until the result is available
boolean cancel(boolean mayInterruptIfRunning); // Attempt to cancel the task
boolean isCancelled(); // Check if the task was cancelled
boolean isDone(); // Check if the task is completed
}
Future ব্যবহার উদাহরণ
এখানে Future ব্যবহার করে একটি অ্যাসিঙ্ক্রোনাস অপারেশন করা হয়েছে যেখানে একটি থ্রেড তৈরি করা হয়েছে এবং ফলাফল পাওয়ার জন্য get() মেথড ব্যবহার করা হয়েছে।
import java.util.concurrent.*;
public class FutureExample {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newSingleThreadExecutor();
// Submit a task to be executed
Future<Integer> future = executor.submit(() -> {
Thread.sleep(2000); // Simulate long computation
return 42; // Return some result
});
// Block until the result is available
Integer result = future.get();
System.out.println("Result from future: " + result);
executor.shutdown();
}
}
এখানে, future.get() মেথডটি থ্রেডটি ব্লক করে রাখে যতক্ষণ না submit() অপারেশনটির ফলাফল পাওয়া যায়।
CompletionHandler এবং Future এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | CompletionHandler | Future |
|---|---|---|
| প্রকার | কলব্যাক হ্যান্ডলার | I/O অপারেশনের ফলাফল/ত্রুটি ফেরত দেয় |
| ফলাফল হ্যান্ডলিং | অ্যাসিঙ্ক্রোনাসভাবে কলব্যাক মেথড দ্বারা হ্যান্ডেল করা হয় | ব্লকিং কল (ফলাফল পাওয়ার জন্য) |
| ব্লকিং | নন-ব্লকিং | ব্লকিং (যতক্ষণ না ফলাফল পাওয়া যায়) |
| ব্যবহারযোগ্যতা | বিশেষভাবে অ্যাসিঙ্ক্রোনাস চ্যানেল অপারেশনগুলির জন্য | সাধারণত থ্রেড পরিচালনার জন্য ব্যবহৃত |
CompletionHandler এবং Future এর প্রয়োজনীয়তা
১. অ্যাসিঙ্ক্রোনাস I/O অপারেশন:
- CompletionHandler এবং Future উভয়ই অ্যাসিঙ্ক্রোনাস I/O অপারেশনের জন্য ব্যবহৃত হয়, তবে একে অপরের তুলনায় তাদের ব্যবহারের পদ্ধতি ভিন্ন।
CompletionHandlerকলব্যাক ভিত্তিক, যেখানেFutureফলাফল বা ত্রুটি ফেরত দেওয়ার জন্য ব্যবহৃত হয়।
২. পারফরম্যান্স এবং স্কেলেবিলিটি:
- অ্যাসিঙ্ক্রোনাস I/O অপারেশনগুলির মাধ্যমে আপনি থ্রেড ব্লক না করে একাধিক I/O অপারেশন পরিচালনা করতে পারেন, যা সিস্টেমের পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করতে সহায়ক।
৩. ফলাফল এবং ত্রুটি হ্যান্ডলিং:
- CompletionHandler সহজভাবে সফল এবং ব্যর্থ অপারেশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়, যেখানে Future অ্যাসিঙ্ক্রোনাস অপারেশনের শেষ ফলাফল বা ত্রুটি ফেরত দেয়।
CompletionHandler এবং Future Java NIO এর গুরুত্বপূর্ণ বৈশিষ্ট্য যা অ্যাসিঙ্ক্রোনাস I/O অপারেশনগুলির মাধ্যমে একাধিক কাজ করার সুযোগ প্রদান করে। CompletionHandler কলব্যাক ভিত্তিক মেথড সরবরাহ করে, যেখানে Future অ্যাসিঙ্ক্রোনাস অপারেশনের ফলাফল ফিরে পেতে ব্লকিং কল তৈরি করে। এই দুটি কৌশল আপনাকে অ্যাসিঙ্ক্রোনাস I/O পরিচালনা করতে সহায়ক, পারফরম্যান্স এবং স্কেলেবিলিটি বাড়াতে সাহায্য করে এবং নেটওয়ার্ক বা ডিস্ক I/O অ্যাপ্লিকেশনগুলির জন্য আদর্শ।
Read more