CompletableFuture এর মাধ্যমে Asynchronous Task Management

CompletableFuture এবং Asynchronous Programming - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

308

CompletableFuture জাভা ৮-এ যোগ করা একটি ক্লাস, যা Future ইন্টারফেসের একটি উন্নত সংস্করণ। এটি অ্যাসিঙ্ক্রোনাস টাস্ক পরিচালনা এবং চেইনিংয়ের মাধ্যমে জটিল অপারেশন সহজ করে।


কেন CompletableFuture ব্যবহার করবেন?

  1. অ্যাসিঙ্ক্রোনাস টাস্ক ম্যানেজমেন্ট: runAsync এবং supplyAsync এর মাধ্যমে নন-ব্লকিং কাজ সম্পাদন।
  2. চেইনিং: টাস্ক চেইন করতে thenApply, thenAccept, এবং thenRun ব্যবহার।
  3. কম্পোজিশন: একাধিক টাস্কের ফলাফল একত্রিত করতে।
  4. ব্যতিক্রম হ্যান্ডলিং: exceptionally এবং handle দিয়ে সহজেই ত্রুটি পরিচালনা।
  5. ব্লকিং এড়ানো: থ্রেড ব্লক না করে কাজ পরিচালনা।

১. 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
Promotion

Are you sure to start over?

Loading...