Asynchronous Programming হল এমন একটি প্রোগ্রামিং পদ্ধতি যেখানে একটি কাজ ব্যাকগ্রাউন্ডে চলতে থাকে এবং সেই কাজের শেষ হওয়া পর্যন্ত অন্যান্য কাজগুলো চলতে থাকে। এর ফলে, আপনি একাধিক কাজ একসাথে করতে পারেন এবং একটি কাজের জন্য অপেক্ষা না করে অন্য কাজ করতে পারেন। Java 8 থেকে CompletableFuture ক্লাসটি যুক্ত করা হয়েছে, যা Asynchronous Programming সহজ এবং কার্যকরী করতে সহায়তা করে।
CompletableFuture এর ধারণা
CompletableFuture হল একটি Future ইন্টারফেসের একটি বাস্তবায়ন যা আপনাকে অ্যাসিঙ্ক্রোনাস অপারেশন (Asynchronous Operations) করতে সহায়তা করে। এটি একটি "future" অবজেক্ট যা ভবিষ্যতে কোনো নির্দিষ্ট মান বা ফলাফল প্রদান করবে।
CompletableFuture ক্লাসটি সাধারণ Future ইন্টারফেস থেকে উন্নত এবং এটি একটি non-blocking অপারেশন পরিচালনা করতে সাহায্য করে। এটি কার্যকরীভাবে callback ফাংশন ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজ পরিচালনা করতে পারে, যার ফলে প্রধান থ্রেড ব্লক (block) না হয় এবং অন্যান্য কাজগুলো চালিয়ে যেতে পারে।
CompletableFuture এর মেথডসমূহ
CompletableFuture বেশ কিছু শক্তিশালী মেথড সরবরাহ করে যা Asynchronous Programming-কে আরও শক্তিশালী এবং সুবিধাজনক করে তোলে। এখানে কিছু মূল মেথড আলোচনা করা হলো:
supplyAsync(): অ্যাসিঙ্ক্রোনাসভাবে একটি টাস্ক চালানোর জন্য ব্যবহৃত হয় এবং একটিCompletableFutureরিটার্ন করে।CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { return 10; });thenApply(): একটিFunctionব্যবহার করে প্রাপ্ত ফলাফলের উপর অপারেশন করতে ব্যবহৃত হয়। এটি একে অপরের সাথে কাজ করার জন্য একটি pipeline তৈরি করতে সহায়তা করে।CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> 10) .thenApply(value -> value * 2);thenAccept(): এটিthenApply()এর মতো, তবে এটি কোন মান রিটার্ন করে না। এটি প্রাপ্ত ফলাফলটি গ্রহণ করে এবং এটি ব্যবহার করে কোনো কাজ করতে সহায়তা করে।CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> 10) .thenAccept(value -> System.out.println(value * 2));thenCombine(): দুটি আলাদাCompletableFutureএর ফলাফল একত্রিত করতে ব্যবহৃত হয়।CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10); CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20); CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (a, b) -> a + b);allOf(): একাধিক অ্যাসিঙ্ক্রোনাস টাস্ক সম্পন্ন হওয়ার জন্য অপেক্ষা করতে ব্যবহৃত হয়।CompletableFuture<Void> future1 = CompletableFuture.supplyAsync(() -> 10); CompletableFuture<Void> future2 = CompletableFuture.supplyAsync(() -> 20); CompletableFuture<Void> allOfFuture = CompletableFuture.allOf(future1, future2); allOfFuture.join();exceptionally(): কোনো ব্যতিক্রম (exception) সংঘটিত হলে তা পরিচালনা করতে ব্যবহৃত হয়।CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { if (true) throw new RuntimeException("Something went wrong!"); return 10; }).exceptionally(ex -> { System.out.println("Exception: " + ex.getMessage()); return 0; });
Asynchronous Programming এর সুবিধা
- Non-blocking I/O: অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে ব্যবহার করে আপনি I/O অপারেশনগুলো ব্লক না করে অন্যান্য কাজ চালিয়ে যেতে পারেন, যেমন নেটওয়ার্ক কল, ডাটাবেস অপারেশন, ইত্যাদি।
- Parallelism: একাধিক কাজ একসাথে করা সম্ভব।
CompletableFutureএর মাধ্যমে একাধিক প্রসেস একযোগে (parallel) চালানো যায়, যেমন একাধিক API কল করা বা সার্ভারের মধ্যে বিভিন্ন ডেটা প্রসেস করা। - Better Utilization of CPU Cores: অ্যাসিঙ্ক্রোনাস কোড মাল্টি-কোর প্রসেসরের সম্পূর্ণ ব্যবহার করতে সাহায্য করে। যখন একটি কাজ ব্যাকগ্রাউন্ডে চলছে, তখন অন্যান্য থ্রেড কাজ চালিয়ে যেতে পারে, ফলে CPU কোরের পূর্ণ ব্যবহার করা হয়।
- Improved Performance: অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং, বিশেষ করে নেটওয়ার্ক এবং I/O ব্যস্ত কাজের জন্য, পারফরম্যান্স বৃদ্ধি করতে সহায়তা করে কারণ আপনি কাজগুলো একে অপরের সাথে সমান্তরালভাবে চালাতে পারেন।
CompletableFuture এর উদাহরণ
উদাহরণ ১: supplyAsync() এবং thenApply() ব্যবহার
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
// supplyAsync() দিয়ে অ্যাসিঙ্ক্রোনাস কাজ শুরু
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000); // Simulate some delay
} catch (InterruptedException e) {
e.printStackTrace();
}
return 10;
});
// thenApply() দিয়ে আসা ফলাফলের ওপর কাজ করা
future.thenApply(result -> {
System.out.println("Result from async task: " + result);
return result * 2;
}).thenAccept(result -> {
System.out.println("Final result: " + result);
});
// Main thread won't block; it will continue executing other tasks.
System.out.println("Main thread continues working...");
}
}এখানে, supplyAsync() একটি ব্যাকগ্রাউন্ড থ্রেডে কাজ শুরু করে এবং তারপর thenApply() ব্যবহার করে প্রাপ্ত মানের উপর কিছু অপারেশন করা হয়।
উদাহরণ ২: allOf() ব্যবহার
import java.util.concurrent.CompletableFuture;
public class AllOfExample {
public static void main(String[] args) {
// Multiple asynchronous tasks
CompletableFuture<Void> future1 = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<Void> future2 = CompletableFuture.supplyAsync(() -> 20);
// Wait for both futures to complete
CompletableFuture<Void> allOfFuture = CompletableFuture.allOf(future1, future2);
allOfFuture.join(); // Wait for all futures to complete
System.out.println("Both tasks completed.");
}
}এখানে, allOf() ব্যবহার করে একাধিক অ্যাসিঙ্ক্রোনাস কাজের জন্য একসাথে অপেক্ষা করা হয়েছে।
সারসংক্ষেপ
CompletableFutureJava 8-এ Asynchronous Programming সহজ করতে সাহায্য করে এবং এটি non-blocking I/O এবং parallel task execution সমর্থন করে।CompletableFutureএর মেথডগুলো যেমনsupplyAsync(),thenApply(),thenAccept(),allOf()ইত্যাদি, অ্যাসিঙ্ক্রোনাস কার্যক্রমের সঙ্গতি এবং কার্যকরীতা বৃদ্ধির জন্য ব্যবহৃত হয়।- Asynchronous Programming বিশেষ করে যখন ব্যাকগ্রাউন্ড টাস্ক বা I/O ব্যস্ত কাজের প্রয়োজন হয়, তখন এটি পারফরম্যান্স বাড়াতে এবং CPU কোরের সম্পূর্ণ ব্যবহার করতে সাহায্য করে।
Read more