CompletableFuture জাভা ৮-এ যোগ করা একটি ক্লাস, যা Future ইন্টারফেসের একটি উন্নত সংস্করণ। এটি অ্যাসিঙ্ক্রোনাস টাস্ক পরিচালনা এবং চেইনিংয়ের মাধ্যমে জটিল অপারেশন সহজ করে।
কেন CompletableFuture ব্যবহার করবেন?
- অ্যাসিঙ্ক্রোনাস টাস্ক ম্যানেজমেন্ট:
runAsyncএবংsupplyAsyncএর মাধ্যমে নন-ব্লকিং কাজ সম্পাদন। - চেইনিং: টাস্ক চেইন করতে
thenApply,thenAccept, এবংthenRunব্যবহার। - কম্পোজিশন: একাধিক টাস্কের ফলাফল একত্রিত করতে।
- ব্যতিক্রম হ্যান্ডলিং:
exceptionallyএবংhandleদিয়ে সহজেই ত্রুটি পরিচালনা। - ব্লকিং এড়ানো: থ্রেড ব্লক না করে কাজ পরিচালনা।
১. CompletableFuture দিয়ে একটি সাধারণ অ্যাসিঙ্ক্রোনাস টাস্ক
import java.util.concurrent.CompletableFuture;
public class CompletableFutureBasic {
public static void main(String[] args) {
// একটি অ্যাসিঙ্ক্রোনাস টাস্ক
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
System.out.println("Task is running in: " + Thread.currentThread().getName());
});
// টাস্ক শেষ হলে মেসেজ প্রিন্ট
future.thenRun(() -> System.out.println("Task completed!"));
// মূল থ্রেড চালু রাখতে অপেক্ষা
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
২. supplyAsync দিয়ে ফলাফল প্রদান করা
import java.util.concurrent.CompletableFuture;
public class CompletableFutureSupplyAsync {
public static void main(String[] args) {
// অ্যাসিঙ্ক্রোনাসভাবে একটি ফলাফল প্রদান
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
System.out.println("Processing in: " + Thread.currentThread().getName());
return "Hello, CompletableFuture!";
});
// চেইন করে ফলাফল প্রিন্ট করা
future.thenApply(result -> {
return result + " Modified.";
}).thenAccept(System.out::println);
// মূল থ্রেড চালু রাখতে অপেক্ষা
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
৩. একাধিক CompletableFuture চেইনিং এবং কম্বিনিং
import java.util.concurrent.CompletableFuture;
public class CompletableFutureChaining {
public static void main(String[] args) {
// প্রথম টাস্ক
CompletableFuture<Integer> task1 = CompletableFuture.supplyAsync(() -> {
System.out.println("Executing Task 1");
return 10;
});
// দ্বিতীয় টাস্ক
CompletableFuture<Integer> task2 = CompletableFuture.supplyAsync(() -> {
System.out.println("Executing Task 2");
return 20;
});
// টাস্ক কম্বিন করা
CompletableFuture<Integer> combinedTask = task1.thenCombine(task2, Integer::sum);
// চূড়ান্ত ফলাফল প্রিন্ট
combinedTask.thenAccept(result -> System.out.println("Final Result: " + result));
// মূল থ্রেড চালু রাখতে অপেক্ষা
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
৪. ব্যতিক্রম হ্যান্ডলিং
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExceptionHandling {
public static void main(String[] args) {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println("Task is running...");
if (true) {
throw new RuntimeException("An error occurred!");
}
return 10;
});
// ব্যতিক্রম পরিচালনা
future.exceptionally(ex -> {
System.out.println("Error: " + ex.getMessage());
return 0; // ডিফল্ট মান প্রদান
}).thenAccept(result -> System.out.println("Result: " + result));
// মূল থ্রেড চালু রাখতে অপেক্ষা
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
৫. একটি বাস্তব উদাহরণ: ডেটাবেস এবং REST API কল সমন্বয়
import java.util.concurrent.CompletableFuture;
public class CompletableFutureRealExample {
public static void main(String[] args) {
// ডেটাবেস থেকে ডেটা ফেচ করা
CompletableFuture<String> dbTask = CompletableFuture.supplyAsync(() -> {
System.out.println("Fetching data from database...");
return "Database Data";
});
// REST API থেকে ডেটা ফেচ করা
CompletableFuture<String> apiTask = CompletableFuture.supplyAsync(() -> {
System.out.println("Fetching data from REST API...");
return "API Data";
});
// ডেটা একত্রিত করা
CompletableFuture<String> combinedTask = dbTask.thenCombine(apiTask, (dbData, apiData) -> {
return dbData + " + " + apiData;
});
// চূড়ান্ত ফলাফল প্রিন্ট
combinedTask.thenAccept(result -> System.out.println("Combined Result: " + result));
// মূল থ্রেড চালু রাখতে অপেক্ষা
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
৬. allOf এবং anyOf এর ব্যবহার
allOf: সমস্ত CompletableFuture শেষ হওয়া পর্যন্ত অপেক্ষা করে।
import java.util.concurrent.CompletableFuture;
public class CompletableFutureAllOf {
public static void main(String[] args) {
CompletableFuture<Void> allTask = CompletableFuture.allOf(
CompletableFuture.runAsync(() -> System.out.println("Task 1")),
CompletableFuture.runAsync(() -> System.out.println("Task 2")),
CompletableFuture.runAsync(() -> System.out.println("Task 3"))
);
allTask.thenRun(() -> System.out.println("All tasks completed!"));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
anyOf: একটি CompletableFuture শেষ হলেই এটি চলবে।
import java.util.concurrent.CompletableFuture;
public class CompletableFutureAnyOf {
public static void main(String[] args) {
CompletableFuture<Object> anyTask = CompletableFuture.anyOf(
CompletableFuture.supplyAsync(() -> {
System.out.println("Task 1 completed");
return "Result from Task 1";
}),
CompletableFuture.supplyAsync(() -> {
System.out.println("Task 2 completed");
return "Result from Task 2";
})
);
anyTask.thenAccept(result -> System.out.println("First completed result: " + result));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
CompletableFuture অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের জন্য একটি অত্যন্ত শক্তিশালী টুল। এটি নিম্নলিখিত সুবিধা প্রদান করে:
- অ্যাসিঙ্ক্রোনাস টাস্ক সহজে পরিচালনা।
- চেইনিংয়ের মাধ্যমে জটিল কাজের সরলীকরণ।
- ত্রুটি পরিচালনা এবং টাস্ক ম্যানেজমেন্ট সহজ করা।
এই ক্লাসটি ব্যবহার করে আপনি নন-ব্লকিং এবং উচ্চ কার্যক্ষম অ্যাপ্লিকেশন তৈরি করতে পারবেন।
Content added By
Read more