CompletableFuture Java 8 এর java.util.concurrent প্যাকেজে অন্তর্ভুক্ত একটি ক্লাস, যা অ্যাসিনক্রোনাস প্রোগ্রামিং এবং non-blocking কার্যকারিতা প্রদান করে। এটি একটি ফিউচার (Future) অবজেক্টের উন্নত সংস্করণ যা আপনাকে asynchronous computation পরিচালনা করতে সক্ষম করে।
এটি অ্যাসিনক্রোনাস (একা সময়) অপারেশনগুলি একত্রিত (combine) এবং সহজভাবে ম্যানেজ করতে সাহায্য করে। Java এর আগের Future ইন্টারফেসের তুলনায় CompletableFuture অনেক বেশি ফিচার সমর্থন করে এবং কার্যকরীভাবে কোড লেখার সুবিধা দেয়।
CompletableFuture এর মৌলিক ধারণা
CompletableFuture একটি Future অবজেক্ট যা completing (সম্পন্ন করা) প্রক্রিয়া আরও সহজ করে। এটি ফিউচার রেজাল্ট হিসাবেও কাজ করে, অর্থাৎ এটি আসন্ন কোনো ফলাফল যা ভবিষ্যতে পাওয়া যাবে, তবে চলমান কাজে কিছু সময় নিতে পারে। CompletableFuture এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য হল, এটি asynchronous অপারেশনকে সমর্থন করে এবং আপনি যখন পুরো অপারেশনটি শেষ করতে চান তখন এর উপর কিছু ফাংশন বা কার্যকলাপ অ্যাপ্লাই করতে পারেন।
CompletableFuture এর মাধ্যমে:
- অ্যাসিনক্রোনাস অপারেশন চালানো যায়।
- কমপ্লেক্স অ্যাসিনক্রোনাস চেইনিং করা যায়।
- non-blocking কার্যকলাপ পরিচালনা করা যায়।
CompletableFuture এর তৈরি করার উপায়
CompletableFuture তৈরি করার জন্য কয়েকটি পদ্ধতি রয়েছে। আপনি এটি সরাসরি নতুন করে তৈরি করতে পারেন বা অ্যাসিনক্রোনাস অপারেশন থেকে শুরু করতে পারেন।
১. supplyAsync() মেথড দ্বারা
এটি একটি নতুন অ্যাসিনক্রোনাস অপারেশন শুরু করে এবং একটি ফলাফল (যেমন একটি অ্যাসিনক্রোনাস কাজের জন্য কোন মান) ফেরত দেয়।
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
// Asynchronous task with supplyAsync
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Simulating delay
} catch (InterruptedException e) {
e.printStackTrace();
}
return 42; // Returning a result
});
// Use the result when it's ready
future.thenAccept(result -> System.out.println("Result: " + result)); // Output: Result: 42
}
}এখানে, supplyAsync() একটি অ্যাসিনক্রোনাস কাজ শুরু করে এবং 1000 মিলিসেকেন্ড পর 42 মানটি ফিরিয়ে দেয়।
২. runAsync() মেথড দ্বারা
এটি অ্যাসিনক্রোনাস কাজ শুরু করে, তবে এটি কোনো ফলাফল ফিরিয়ে দেয় না।
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
// Asynchronous task without returning a result
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
try {
Thread.sleep(1000); // Simulating a task
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task completed");
});
// Wait for the task to complete
future.join(); // Blocks until the task is completed
}
}এখানে, runAsync() একটি অ্যাসিনক্রোনাস কাজ শুরু করে, কিন্তু কোনো মান ফিরিয়ে দেয় না। এটি শুধুমাত্র কাজ সম্পন্ন হলে একটি বার্তা প্রদর্শন করে।
CompletableFuture এর ব্যবহার এবং কার্যকারিতা
১. thenApply() এবং thenAccept()
thenApply() এবং thenAccept() আপনাকে ফিউচার কাজের উপর পরবর্তী স্টেপ যোগ করতে সহায়তা করে। এগুলি ফাংশনাল প্রোগ্রামিং স্টাইলের মতো, যেখানে আপনি একটি ফাংশন পরপর একাধিক কাজে প্রয়োগ করতে পারেন।
thenApply(): একটি ফলাফল নিয়ে পরবর্তী অপারেশন করার জন্য ব্যবহার হয়।thenAccept(): একটি ফলাফল গ্রহণ করে একটি সাইড-এফেক্ট তৈরি করে (যেমন, প্রিন্ট বা লগ)।
উদাহরণ:
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
return 10;
});
future.thenApply(result -> result * 2) // Multiply the result by 2
.thenAccept(result -> System.out.println("Final result: " + result)); // Output: Final result: 20
}
}এখানে, প্রথমে একটি অ্যাসিনক্রোনাস কাজ (10 রিটার্ন) শুরু করা হয়েছে, তারপর thenApply() এর মাধ্যমে মানটি 2 গুণ বাড়ানো হয়েছে এবং অবশেষে thenAccept() এর মাধ্যমে ফলাফল প্রিন্ট করা হয়েছে।
২. thenCombine()
thenCombine() মেথডটি দুটি CompletableFuture কে একত্রে (combine) একটি একক ফলাফলে রূপান্তর করতে ব্যবহৃত হয়।
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 10);
future1.thenCombine(future2, (result1, result2) -> result1 + result2)
.thenAccept(result -> System.out.println("Combined result: " + result)); // Output: Combined result: 15
}
}এখানে, দুটি অ্যাসিনক্রোনাস কাজের ফলাফল একত্রিত (combine) হয়ে 15 হিসেবে প্রিন্ট করা হয়েছে।
৩. exceptionally()
exceptionally() ব্যবহার করে আপনি একটি এক্সেপশন হ্যান্ডলার অ্যাসাইন করতে পারেন, যা কোনো ত্রুটি (exception) ঘটলে একটি ডিফল্ট মান প্রদান করবে।
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Something went wrong");
});
future.exceptionally(ex -> {
System.out.println("Exception: " + ex.getMessage());
return 0; // Default value in case of exception
}).thenAccept(result -> System.out.println("Result: " + result)); // Output: Exception: Something went wrong, Result: 0
}
}এখানে, exceptionally() মেথডটি ত্রুটি ঘটলে একটি ডিফল্ট মান 0 ফেরত দিয়েছে।
CompletableFuture এর বিশেষ বৈশিষ্ট্য
- Non-blocking I/O:
CompletableFutureব্যবহার করে I/O অপারেশনগুলিকে non-blockingভাবে পরিচালনা করা যায়। এতে কোনো থ্রেড ব্লক হয় না এবং অন্যান্য কাজ চলতে থাকে। - Composing Asynchronous Tasks: একাধিক অ্যাসিনক্রোনাস কাজকে চেইন আকারে সংযুক্ত করা যায়।
- Concurrency: একাধিক অ্যাসিনক্রোনাস কাজকে প্যারালালভাবে চালানো যায়।
- Exception Handling:
CompletableFuture-এ অ্যাসিনক্রোনাস কাজের জন্য এক্সেপশন হ্যান্ডলিং সহজ করে দেওয়া হয়েছে।
সারসংক্ষেপ
CompletableFuture Java 8-এ অ্যাসিনক্রোনাস প্রোগ্রামিংকে আরও সহজ এবং কার্যকরী করে তোলে। এটি আপনাকে:
- Asynchronous computation পরিচালনা করতে সহায়তা করে।
- একাধিক কাজের ফলাফল একত্রে (combine) করতে পারে।
- একটি ফলাফল পেতে ব্লক না করে (non-blocking) কাজ করতে পারে।
- ফলাফলের সাথে প্রক্রিয়া যোগ করতে বা এক্সেপশন হ্যান্ডলিং করতে সহায়তা করে।
এটি Java concurrency এবং parallel programming এর জন্য একটি শক্তিশালী টুল হিসেবে ব্যবহৃত হচ্ছে, বিশেষ করে যেখানে বড় পরিমাণের কাজ দ্রুত সম্পন্ন করতে হয়।
Read more