Asynchronous Tasks এর সাথে CompletableFuture

CompletableFuture (কমপ্লিটেবল ফিউচার) - জাভা (Java 8) - Computer Programming

359

Java 8-এ CompletableFuture ক্লাসটি Asynchronous Programming বা non-blocking I/O operations পরিচালনার জন্য একটি শক্তিশালী টুল হিসেবে যোগ করা হয়েছে। এটি Future ইন্টারফেসের একটি উন্নত সংস্করণ, যা asynchronous বা parallel tasks সহজে পরিচালনা করতে সহায়তা করে।

CompletableFuture ব্যবহার করে আপনি asynchronous tasks একত্রে কাজ করাতে পারেন, বিভিন্ন কাজের মধ্যে নির্দিষ্ট সময়ের জন্য অপেক্ষা না করে। এতে অ্যাসিঙ্ক্রোনাস কোডের মধ্যে callback বা chaining তৈরি করা সম্ভব।

Asynchronous Tasks এবং CompletableFuture

Asynchronous tasks হল সেই কাজগুলি যা ব্যাকগ্রাউন্ডে চলতে থাকে এবং তারা প্রধান থ্রেড (main thread) বা অন্যান্য কাজগুলির সাথে সমান্তরালে সম্পাদিত হয়। Java-তে, সিঙ্ক্রোনাস কাজের পরিবর্তে অ্যাসিঙ্ক্রোনাস কাজগুলি পরিচালনা করার জন্য CompletableFuture খুবই কার্যকরী।

CompletableFuture দিয়ে আপনি:

  • একাধিক অ্যাসিঙ্ক্রোনাস কাজ সমান্তরালে চালাতে পারেন
  • কাজগুলো শেষ হওয়ার পর ফলাফল প্রাপ্তির জন্য callback তৈরি করতে পারেন
  • অ্যাসিঙ্ক্রোনাস কাজের exception handling করতে পারেন

CompletableFuture এর মেথডসমূহ

  1. supplyAsync(): একটি অ্যাসিঙ্ক্রোনাস কাজ শুরু করে, এবং এটি একটি CompletableFuture রিটার্ন করে।
  2. thenApply(): কোনো CompletableFuture থেকে প্রাপ্ত ফলাফল পরবর্তী অপারেশন বা মানে রূপান্তর করতে ব্যবহৃত হয়।
  3. thenAccept(): প্রাপ্ত ফলাফলের উপর কোনো কার্যক্রম করতে ব্যবহৃত হয়, কিন্তু ফলাফল রিটার্ন করে না।
  4. thenCombine(): দুটি পৃথক CompletableFuture এর ফলাফল একত্রিত করতে ব্যবহৃত হয়।
  5. allOf(): একাধিক CompletableFuture এর সমাপ্তির জন্য অপেক্ষা করতে ব্যবহৃত হয়।
  6. exceptionally(): কোনো exception ঘটলে তা হ্যান্ডেল করতে ব্যবহৃত হয়।

CompletableFuture এর মাধ্যমে Asynchronous Tasks পরিচালনা

উদাহরণ ১: supplyAsync() ব্যবহার

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String[] args) {
        // Start asynchronous task
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000);  // Simulate long running task
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 10;
        });

        // Continue working without blocking
        System.out.println("Main thread continues working...");

        // Wait for the result and print
        future.thenAccept(result -> System.out.println("Result: " + result));
    }
}

এখানে, supplyAsync() একটি অ্যাসিঙ্ক্রোনাস কাজ শুরু করে এবং ব্যাকগ্রাউন্ডে 2 সেকেন্ডের জন্য স্লিপ করে (এটি একটি লম্বা কাজের মতো)। Main thread ব্লক না হয়ে, অন্যান্য কাজ চালিয়ে যায় এবং পরবর্তী স্টেপে ফলাফলটি প্রিন্ট করা হয়।


উদাহরণ ২: thenApply() ব্যবহার

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String[] args) {
        // Asynchronous task to get a number
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10);

        // Chaining another asynchronous operation on the result
        future.thenApply(result -> result * 2)  // Multiply result by 2
              .thenAccept(finalResult -> System.out.println("Final result: " + finalResult)); // Output: 20
    }
}

এখানে, প্রথমে CompletableFuture.supplyAsync() মেথডে 10 পাওয়া যাচ্ছে এবং তারপর thenApply() ব্যবহার করে সেই মানকে দ্বিগুণ করা হচ্ছে। thenAccept() মেথড ব্যবহার করে শেষের ফলাফলটি আউটপুট করা হয়েছে।


উদাহরণ ৩: thenCombine() ব্যবহার

thenCombine() দুটি আলাদা CompletableFuture এর ফলাফল একত্রিত করতে ব্যবহৃত হয়।

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String[] args) {
        // Asynchronous task 1
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);

        // Asynchronous task 2
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);

        // Combine both results
        CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + result2);

        // Print the result
        combinedFuture.thenAccept(result -> System.out.println("Combined result: " + result));  // Output: Combined result: 30
    }
}

এখানে, দুটি অ্যাসিঙ্ক্রোনাস কাজের ফলাফল একত্রিত করা হয়েছে এবং তারপর thenAccept() মেথড দিয়ে ফলাফল প্রিন্ট করা হয়েছে।


উদাহরণ ৪: allOf() ব্যবহার

allOf() মেথড একাধিক CompletableFuture এর সমাপ্তির জন্য অপেক্ষা করে।

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String[] args) {
        // Asynchronous tasks
        CompletableFuture<Void> future1 = CompletableFuture.supplyAsync(() -> {
            try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
            return "Task 1 Completed";
        }).thenAccept(System.out::println);

        CompletableFuture<Void> future2 = CompletableFuture.supplyAsync(() -> {
            try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); }
            return "Task 2 Completed";
        }).thenAccept(System.out::println);

        // Wait for all tasks to complete
        CompletableFuture<Void> allOfFuture = CompletableFuture.allOf(future1, future2);
        allOfFuture.join();  // Blocking wait for both futures to finish
        System.out.println("All tasks completed.");
    }
}

এখানে, allOf() মেথডটি ব্যবহার করে দুটি অ্যাসিঙ্ক্রোনাস কাজের জন্য অপেক্ষা করা হয়েছে এবং একবার সব কাজ শেষ হলে একটি মেসেজ প্রিন্ট করা হয়েছে।


CompletableFuture এর মধ্যে Exception Handling

যেহেতু অ্যাসিঙ্ক্রোনাস কোডে ব্যতিক্রম ঘটতে পারে, সেক্ষেত্রে exceptionally() মেথড ব্যবহার করে exception handling করা সম্ভব।

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            if (true) throw new RuntimeException("Something went wrong!");
            return 10;
        });

        future.exceptionally(ex -> {
            System.out.println("Exception: " + ex.getMessage());
            return 0; // Default value
        }).thenAccept(result -> System.out.println("Result: " + result));
    }
}

এখানে, exceptionally() মেথডটি ব্যবহার করে কোনো ব্যতিক্রম ঘটলে তা হ্যান্ডেল করা হয়েছে এবং ডিফল্ট মান 0 রিটার্ন করা হয়েছে।


সারসংক্ষেপ

  • CompletableFuture Java-তে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং সহজ করে এবং non-blocking কাজের জন্য একটি শক্তিশালী টুল।
  • এটি supplyAsync(), thenApply(), thenAccept(), allOf() ইত্যাদি মেথড সরবরাহ করে যা একাধিক অ্যাসিঙ্ক্রোনাস কাজ সমান্তরালে বা একে অপরের সাথে চেইন করতে সহায়তা করে।
  • Exception Handling এবং callback functions এর মাধ্যমে অ্যাসিঙ্ক্রোনাস কোড আরও কার্যকরী এবং স্থিতিশীল করা যায়।

CompletableFuture Java-তে অ্যাসিঙ্ক্রোনাস কাজগুলি সহজ ও কার্যকরভাবে পরিচালনার জন্য একটি অন্যতম উপায়।

Content added By
Promotion

Are you sure to start over?

Loading...