CompletableFuture কি এবং কেন দরকার?

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

337

CompletableFuture হলো জাভা কনকারেন্সি API-তে থাকা একটি শক্তিশালী ক্লাস, যা অ্যাসিনক্রোনাস (asynchronous) প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়। এটি জাভা 8-এ পরিচিত হয় এবং অনেক সুবিধাজনক মেথড সরবরাহ করে যা অ্যাসিনক্রোনাস কাজ সম্পাদনে সাহায্য করে।


CompletableFuture এর উদ্দেশ্য

  1. অ্যাসিনক্রোনাস প্রোগ্রামিং সহজ করা:
    • CompletableFuture এর মাধ্যমে আপনি থ্রেড ম্যানেজমেন্ট বা লকিং ছাড়াই অ্যাসিনক্রোনাস কাজ করতে পারেন।
  2. নন-ব্লকিং কোড:
    • এটি একটি নন-ব্লকিং মেকানিজম, যেখানে থ্রেডগুলি কাজ শেষ হওয়ার জন্য অপেক্ষা না করে অন্য কাজ করতে পারে।
  3. চেইনড প্রসেসিং:
    • একাধিক অ্যাসিনক্রোনাস কাজ চেইনের মতো সম্পাদন করতে সাহায্য করে।
  4. থ্রেড পুল ব্যবস্থাপনা:
    • ডিফল্ট থ্রেড পুল ব্যবহার করে কাজ পরিচালনা করে, তবে প্রয়োজনে কাস্টম থ্রেড পুলও ব্যবহার করা যায়।

CompletableFuture এর সুবিধা

  • অ্যাসিনক্রোনাস এবং ইভেন্ট-ড্রিভেন প্রোগ্রামিং সহজ করে।
  • ব্লকিং কোড থেকে মুক্তি দেয়।
  • একাধিক কাজ সমান্তরালভাবে সম্পাদন করতে পারে।
  • একাধিক CompletableFuture কে একত্রে ব্যবহার করে জটিল কনকারেন্সি সমস্যা সমাধান করতে পারে।

CompletableFuture ব্যবহার উদাহরণ

১. বেসিক CompletableFuture ব্যবহার

import java.util.concurrent.CompletableFuture;

public class BasicCompletableFutureExample {
    public static void main(String[] args) {
        // অ্যাসিনক্রোনাস টাস্ক
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(1000);
                System.out.println("Task completed!");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        System.out.println("Doing other work while task runs...");
        
        // মূল থ্রেডে কাজ শেষ হওয়ার জন্য অপেক্ষা
        future.join();
        System.out.println("Main thread done!");
    }
}

২. রিটার্ন ভ্যালু সহ CompletableFuture

import java.util.concurrent.CompletableFuture;

public class ReturnValueExample {
    public static void main(String[] args) {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000);
                return "Hello from CompletableFuture!";
            } catch (InterruptedException e) {
                e.printStackTrace();
                return null;
            }
        });

        // ফিউচারের রিটার্ন ভ্যালু প্রিন্ট
        String result = future.join();
        System.out.println(result);
    }
}

৩. CompletableFuture চেইনিং

import java.util.concurrent.CompletableFuture;

public class ChainingExample {
    public static void main(String[] args) {
        CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("Fetching data...");
            return "Data fetched!";
        }).thenApply(data -> {
            System.out.println("Processing data...");
            return data.toUpperCase();
        }).thenAccept(result -> {
            System.out.println("Result: " + result);
        });

        future.join();
    }
}

৪. একাধিক CompletableFuture একত্রে ব্যবহার

import java.util.concurrent.CompletableFuture;

public class CombineFuturesExample {
    public static void main(String[] args) {
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            return "Hello";
        });

        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            return "World";
        });

        CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> {
            return result1 + " " + result2;
        });

        System.out.println(combinedFuture.join()); // Output: Hello World
    }
}

৫. Exception Handling সহ CompletableFuture

import java.util.concurrent.CompletableFuture;

public class ExceptionHandlingExample {
    public static void main(String[] args) {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            if (true) {
                throw new RuntimeException("Something went wrong!");
            }
            return "Success!";
        }).exceptionally(ex -> {
            System.out.println("Exception: " + ex.getMessage());
            return "Recovered from failure";
        });

        System.out.println(future.join());
    }
}

CompletableFuture কেন দরকার?

  1. সাধারণ থ্রেড API এর চেয়ে সহজ:
    • Thread, ExecutorService ব্যবহার করে ম্যানুয়াল থ্রেড ম্যানেজমেন্ট জটিল হয়, যেখানে CompletableFuture ব্যবহার সহজ।
  2. ব্লকিং এড়ানো:
    • অ্যাসিনক্রোনাস কাজ সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করার প্রয়োজন নেই।
  3. বেশি পারফরম্যান্স:
    • নন-ব্লকিং অপারেশন এবং ডিফল্ট থ্রেড পুল ব্যবহার করে।
  4. ফিউচার চেইনিং:
    • একাধিক কাজ ধাপে ধাপে করতে সাহায্য করে।
  5. সিম্পল এক্সেপশন হ্যান্ডলিং:
    • এক্সেপশন ম্যানেজ করার জন্য সরাসরি মেথড (exceptionally, handle) আছে।

সেরা অনুশীলন (Best Practices)

  1. কাস্টম থ্রেড পুল ব্যবহার: ভারী লোডের জন্য কাস্টম Executor ব্যবহার করুন।
  2. অপ্রয়োজনীয় ব্লকিং এড়ান: get() এর পরিবর্তে join() ব্যবহার করুন।
  3. ঠিকমতো চেইনিং করুন: thenApply(), thenAccept() এবং thenCombine() সঠিকভাবে ব্যবহার করুন।
  4. Exception Handling নিশ্চিত করুন: অ্যাসিনক্রোনাস এক্সেপশনগুলো সঠিকভাবে পরিচালনা করুন।
  5. Debugging টুল ব্যবহার করুন: CompletableFuture এর চেইন বড় হলে ডিবাগিং কঠিন হয়, এজন্য লগিং নিশ্চিত করুন।

CompletableFuture হল জাভার একটি আধুনিক অ্যাসিনক্রোনাস প্রোগ্রামিং টুল, যা মাল্টিথ্রেডিং এবং কনকারেন্সি সমস্যাগুলো সহজ এবং কার্যকরীভাবে সমাধান করতে সহায়ক। এটি নন-ব্লকিং এবং অ্যাসিনক্রোনাস কাজ সহজে এবং পারফরম্যান্স বৃদ্ধি করে।

Content added By
Promotion

Are you sure to start over?

Loading...