Java Functional Programming-এ CompletableFuture এবং Asynchronous Programming দুটি অত্যন্ত গুরুত্বপূর্ণ বিষয়, বিশেষত Java 8 এবং পরবর্তী সংস্করণগুলিতে, যা আপনাকে non-blocking এবং concurrent প্রোগ্রামিং করতে সাহায্য করে। CompletableFuture হল Java Concurrency API এর একটি অংশ যা সহজে asynchronous প্রোগ্রামিং সমর্থন করে। এটি future-based asynchronous প্রোগ্রামিং মডেল প্রদান করে এবং সিস্টেমের বিভিন্ন অংশকে একে অপরের সাথে সমান্তরালে (parallel) কাজ করতে সক্ষম করে, যেটি মূলত Functional Programming এর একটি অংশ।
Asynchronous Programming কি?
Asynchronous Programming হল একটি প্রোগ্রামিং কৌশল যেখানে কিছু অপারেশন একসাথে চলতে পারে (বা non-blocking) যখন অন্য অপারেশন সম্পন্ন হচ্ছে। সাধারণত, blocking অপারেশনগুলো (যেমন, I/O অপারেশন) ধীর গতিতে চলে এবং অন্য কোডের কার্যকলাপ আটকে রাখতে পারে। Asynchronous Programming আপনাকে এই ধরনের অপারেশনগুলি asynchronously (অর্থাৎ একে অপরের সাথে সমান্তরালভাবে) পরিচালনা করতে সাহায্য করে, যা কর্মক্ষমতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সহায়তা করে।
CompletableFuture এর ধারণা:
CompletableFuture হল Java 8-এ প্রবর্তিত একটি ক্লাস যা Future ইন্টারফেসের একটি বিশেষ সংস্করণ, এবং এটি asynchronous প্রোগ্রামিং সমর্থন করে। CompletableFuture ব্যবহার করে আপনি ভবিষ্যতের একটি মান (future value) তৈরি করতে পারেন এবং যখন তা প্রস্তুত হয় তখন তার সাথে কিছু কাজ সম্পন্ন করতে পারেন। এটি non-blocking এবং event-driven কোড লিখতে সহায়তা করে।
CompletableFuture এর বৈশিষ্ট্য:
- Asynchronous computation:
CompletableFutureদিয়ে আপনি asynchronousভাবে কোনো কাজ চালাতে পারেন, যেমন ফাইল ডাউনলোড বা API কল। - Chaining:
CompletableFuturechaining এর মাধ্যমে একাধিক asynchronous কাজ একে অপরের সাথে সংযুক্ত করা যায়। - Callback Mechanism:
CompletableFutureএর সাথে callback ব্যবহার করে আপনি কাজের শেষে একটি নির্দিষ্ট কাজ বা এক্সপ্রেশন রান করতে পারেন। - Exception Handling:
CompletableFutureexception handling সমর্থন করে, যার মাধ্যমে asynchronous কাজের মধ্যে ত্রুটি ঘটলে তা handle করা যায়।
CompletableFuture-এর মেথডসমূহ:
supplyAsync(): এটি একটি asynchronous computation শুরু করে এবং একটিCompletableFutureরিটার্ন করে।thenApply(): এই মেথডটি asynchronous কাজের ফলাফল গ্রহণ করে এবং পরবর্তী কাজ করে।thenAccept(): এই মেথডটি শুধুমাত্র asynchronous কাজের ফলাফল গ্রহণ করে এবং কোন রিটার্ন মান ছাড়া প্রক্রিয়াজাত করে।thenRun(): এই মেথডটি কোনও ইনপুট গ্রহণ না করে কেবল কোড ব্লক রান করে।whenComplete(): এই মেথডটি একটিCompletionStageদিয়ে কাজ সম্পন্ন হওয়ার পরে একটি callback ফাংশন রান করে।exceptionally(): এটি asynchronous কাজের সময়ে যদি কোনো ত্রুটি হয়, তবে তা handle করে।
CompletableFuture এর উদাহরণ:
1. Basic Usage of CompletableFuture
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
// CompletableFuture creates an asynchronous task
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
return 10 * 2;
});
// Get the result after computation
future.thenAccept(result -> System.out.println("The result is: " + result));
}
}
এখানে supplyAsync() ব্যবহার করা হয়েছে একটি asynchronous কাজ সম্পন্ন করার জন্য। তারপরে, thenAccept() মেথড ব্যবহার করা হয়েছে কাজের ফলাফল নেওয়ার জন্য এবং তা আউটপুট হিসেবে প্রদর্শন করার জন্য।
2. Chaining Multiple Tasks in CompletableFuture
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10)
.thenApplyAsync(result -> result * 2) // Multiply by 2
.thenApplyAsync(result -> result + 5); // Add 5
future.thenAccept(result -> System.out.println("Final result: " + result));
}
}
এখানে, আমরা chaining ব্যবহার করে multiple asynchronous tasks সম্পন্ন করছি। প্রথমে 10 দেওয়া হচ্ছে, তারপর তাকে গুণ করা হচ্ছে 2 দ্বারা, এবং শেষে 5 যোগ করা হচ্ছে। প্রতিটি স্টেপ asynchronousভাবে কার্যকর হচ্ছে।
3. Handling Exceptions in CompletableFuture
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
if (true) {
throw new RuntimeException("Something went wrong!");
}
return 10;
});
// Handling exception
future.exceptionally(ex -> {
System.out.println("Exception: " + ex.getMessage());
return 0; // Default value in case of error
}).thenAccept(result -> System.out.println("Result: " + result));
}
}
এখানে, exceptionally() ব্যবহার করা হয়েছে যাতে যদি কোনো exception ঘটে তবে তা handle করা যায় এবং একটি ডিফল্ট মান রিটার্ন করা যায়।
Asynchronous Programming এর প্রয়োজনীয়তা
- Non-blocking I/O:
- Asynchronous Programming ব্যবহার করে আপনি non-blocking I/O অপারেশন করতে পারেন। যেমন ফাইল অপারেশন বা API কল করা, যাতে মূল থ্রেড আটকে না থাকে এবং অন্যান্য কাজ চলতে থাকে।
- Improved Performance:
- Asynchronous programming একাধিক কাজকে একসাথে (concurrently) চালাতে পারে, যেমনঃ একাধিক I/O অপারেশন, যা পারফরম্যান্স এবং রেসপন্স টাইম উন্নত করে।
- Better User Experience:
- UI অ্যাপ্লিকেশনে, যখন ব্যাকগ্রাউন্ডে কোনো কাজ চলতে থাকে, তখন মূল UI থ্রেড ব্লক করা হয় না। এটি ব্যবহারকারীর জন্য একটি মসৃণ অভিজ্ঞতা তৈরি করে।
- Scalability:
- Asynchronous প্রোগ্রামিংয়ের মাধ্যমে আপনি কম সময়ে অনেক কাজ সম্পন্ন করতে পারেন। এটি বড় সিস্টেমে কার্যকরী এবং একাধিক ব্যবহারকারীকে সমর্থন করতে সহায়ক।
CompletableFuture এবং Asynchronous Programming Java 8 এবং পরবর্তী সংস্করণে একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা আপনাকে concurrent এবং non-blocking কাজ করতে সহায়তা করে। CompletableFuture ব্যবহারের মাধ্যমে আপনি asynchronous কাজগুলো কার্যকরভাবে পরিচালনা করতে পারেন এবং সেগুলির উপর বিভিন্ন মেথড চেইনিং বা exception handling করতে পারেন। এটি Java Functional Programming এর একটি গুরুত্বপূর্ণ অংশ, যা ডেটা প্রসেসিংকে আরো উন্নত এবং পারফরম্যান্সে কার্যকর করে তোলে। Asynchronous programming এর মাধ্যমে improved performance, better user experience, এবং scalability নিশ্চিত করা যায়, বিশেষ করে I/O অপারেশন এবং দীর্ঘমেয়াদি কার্যকলাপের জন্য।
Read more