Future, CompletableFuture এবং Executor এর উন্নত ব্যবহার

Advanced Concurrency Patterns এবং Best Practices - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

346

Java Concurrency API তে Future, CompletableFuture, এবং Executor মাল্টিথ্রেডেড প্রোগ্রামিং আরও সহজ ও কার্যকর করে। তারা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং এবং কনকারেন্ট টাস্ক ম্যানেজমেন্টের জন্য উন্নত সমাধান প্রদান করে।


1. Future

Future কী?

  • Future ইন্টারফেস একটি অ্যাসিঙ্ক্রোনাস টাস্কের রেজাল্ট ধরে রাখে, যা ভবিষ্যতে উপলব্ধ হবে।
  • এটি ExecutorService এর সাহায্যে ব্যবহার করা হয়।

Future এর প্রধান মেথডসমূহ:

মেথডবর্ণনা
get()রেজাল্ট ফেরত দেয়; যদি রেজাল্ট প্রস্তুত না হয়, এটি ব্লক হয়।
get(long timeout, TimeUnit unit)নির্দিষ্ট সময় পর্যন্ত অপেক্ষা করে রেজাল্ট রিটার্ন করে।
isDone()টাস্ক সম্পন্ন হয়েছে কিনা তা চেক করে।
cancel(boolean mayInterruptIfRunning)টাস্ক বাতিল করার জন্য।

Future এর উদাহরণ:

import java.util.concurrent.*;

public class FutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        Callable<Integer> task = () -> {
            Thread.sleep(2000); // Simulate some work
            return 42;
        };

        Future<Integer> future = executor.submit(task);

        System.out.println("Task is submitted. Doing other work...");

        // Wait for the result
        Integer result = future.get(); // Blocks until the task is complete
        System.out.println("Result: " + result);

        executor.shutdown();
    }
}

Future এর সীমাবদ্ধতা:

  1. ব্লকিং: get() মেথড ব্লক করে রাখে যতক্ষণ না রেজাল্ট প্রস্তুত।
  2. ক্যোডিনেশন কঠিন: চেইনিং এবং কমপ্লেক্স অ্যাসিঙ্ক্রোনাস লজিক পরিচালনা করা কঠিন।

2. CompletableFuture

CompletableFuture কী?

  • CompletableFuture হলো Future-এর একটি উন্নত সংস্করণ যা নন-ব্লকিং এবং চেইনড অ্যাসিঙ্ক্রোনাস টাস্ক পরিচালনা করতে সক্ষম।
  • এটি Functional Programming এবং Callback Mechanism সমর্থন করে।

CompletableFuture এর প্রধান মেথডসমূহ:

মেথডবর্ণনা
supplyAsync(Supplier<T>)অ্যাসিঙ্ক্রোনাস টাস্ক শুরু করে এবং রেজাল্ট ফেরত দেয়।
thenApply(Function<T, R>)রেজাল্টে একটি অপারেশন প্রয়োগ করে।
thenAccept(Consumer<T>)রেজাল্ট গ্রহণ করে এবং কিছু করে (রিটার্ন কিছুই নয়)।
thenCombine(CompletableFuture, BiFunction)দুইটি CompletableFuture এর রেজাল্ট একত্রিত করে।
exceptionally(Function<Throwable, T>)ব্যতিক্রম হ্যান্ডল করে।

CompletableFuture এর উদাহরণ:

১. Basic Usage

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("Performing a task...");
            return 42;
        });

        future.thenApply(result -> result * 2)
              .thenAccept(result -> System.out.println("Final Result: " + result));

        System.out.println("Doing other work...");
    }
}

২. Combining Multiple Futures

import java.util.concurrent.CompletableFuture;

public class CombineFuturesExample {
    public static void main(String[] args) {
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);

        CompletableFuture<Integer> resultFuture = future1.thenCombine(future2, Integer::sum);

        resultFuture.thenAccept(result -> System.out.println("Sum: " + result));
    }
}

৩. Exception Handling

import java.util.concurrent.CompletableFuture;

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

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

3. Executor

ExecutorService:

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

Executor এর উন্নত ব্যবহার:

১. Fixed Thread Pool

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FixedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3);

        Runnable task = () -> {
            System.out.println(Thread.currentThread().getName() + " is running.");
        };

        for (int i = 0; i < 5; i++) {
            executor.submit(task);
        }

        executor.shutdown();
    }
}

২. Scheduled Executor

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledExecutorExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);

        Runnable task = () -> System.out.println("Executing at: " + System.currentTimeMillis());

        scheduler.scheduleAtFixedRate(task, 0, 2, TimeUnit.SECONDS);
    }
}

Best Practices

  1. Non-blocking Code:
    • CompletableFuture ব্যবহার করে নন-ব্লকিং অপারেশন ডিজাইন করুন।
  2. Exception Handling:
    • exceptionally বা handle মেথড ব্যবহার করে ব্যতিক্রম হ্যান্ডল করুন।
  3. Thread Pool Size Optimization:
    • সঠিক Thread Pool Size কনফিগার করুন।
  4. Combine Multiple Futures:
    • একাধিক অ্যাসিঙ্ক্রোনাস টাস্ক একত্রিত করতে thenCombine এবং thenCompose ব্যবহার করুন।
  5. Scheduled Tasks:
    • নির্দিষ্ট সময়ে টাস্ক সম্পাদনের জন্য ScheduledExecutorService ব্যবহার করুন।

Future, CompletableFuture, এবং Executor কনকারেন্সি এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ে অত্যন্ত কার্যকর। তারা সিস্টেমের পারফরম্যান্স উন্নত করে এবং জটিল অ্যাসিঙ্ক্রোনাস লজিক সহজ করে। CompletableFuture এবং ExecutorService একসাথে ব্যবহার করলে কোড আরও পরিষ্কার এবং কার্যকর হয়।

Content added By
Promotion

Are you sure to start over?

Loading...