RecursiveTask এবং RecursiveAction এর ব্যবহার

ForkJoin Framework এবং Parallelism - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

341

RecursiveTask এবং RecursiveAction হলো জাভার Fork/Join Framework এর অংশ, যা কনকারেন্সি কার্যকরভাবে পরিচালনা করার জন্য ব্যবহৃত হয়। এই ফ্রেমওয়ার্ক বড় কাজগুলোকে ছোট টুকরোতে ভাগ করে একাধিক থ্রেডের মধ্যে সমান্তরালভাবে কার্য সম্পাদন করে।


RecursiveTask: রিটার্ন মান সহ কাজ ভাগ করা

RecursiveTask এমন একটি ক্লাস যা কাজ ভাগ করে এবং রেজাল্ট প্রদান করে। এটি সাধারণত divide-and-conquer প্যাটার্নে ব্যবহৃত হয়।

উদাহরণ: একটি সংখ্যার তালিকার যোগফল গণনা

import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;

class SumTask extends RecursiveTask<Integer> {
    private final int[] numbers;
    private final int start;
    private final int end;

    private static final int THRESHOLD = 10; // কাজ ভাগ করার সীমা

    public SumTask(int[] numbers, int start, int end) {
        this.numbers = numbers;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        // যদি কাজ ছোট হয়, সরাসরি সমাধান করুন
        if (end - start <= THRESHOLD) {
            int sum = 0;
            for (int i = start; i < end; i++) {
                sum += numbers[i];
            }
            return sum;
        } else {
            // কাজ ভাগ করুন
            int mid = (start + end) / 2;
            SumTask leftTask = new SumTask(numbers, start, mid);
            SumTask rightTask = new SumTask(numbers, mid, end);

            leftTask.fork(); // সাবটাস্ক শুরু
            int rightResult = rightTask.compute(); // ডানদিকের সাবটাস্ক সমাধান
            int leftResult = leftTask.join(); // বামদিকের সাবটাস্ক থেকে রেজাল্ট পান

            return leftResult + rightResult; // ফলাফল যোগ করুন
        }
    }
}

public class RecursiveTaskExample {
    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();

        int[] numbers = new int[100];
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = i + 1;
        }

        SumTask task = new SumTask(numbers, 0, numbers.length);
        int result = pool.invoke(task);

        System.out.println("Sum: " + result);
    }
}

RecursiveAction: রিটার্ন মান ছাড়া কাজ ভাগ করা

RecursiveAction একটি থ্রেড সেফ ক্লাস, যা কাজ ভাগ করে এবং কার্য সম্পাদন করে, কিন্তু কোনো রিটার্ন মান দেয় না।

উদাহরণ: একটি সংখ্যার তালিকার ডাবলিং

import java.util.concurrent.RecursiveAction;
import java.util.concurrent.ForkJoinPool;

class DoubleTask extends RecursiveAction {
    private final int[] numbers;
    private final int start;
    private final int end;

    private static final int THRESHOLD = 10; // কাজ ভাগ করার সীমা

    public DoubleTask(int[] numbers, int start, int end) {
        this.numbers = numbers;
        this.start = start;
        this.end = end;
    }

    @Override
    protected void compute() {
        // যদি কাজ ছোট হয়, সরাসরি সমাধান করুন
        if (end - start <= THRESHOLD) {
            for (int i = start; i < end; i++) {
                numbers[i] *= 2; // মান ডাবল করুন
            }
        } else {
            // কাজ ভাগ করুন
            int mid = (start + end) / 2;
            DoubleTask leftTask = new DoubleTask(numbers, start, mid);
            DoubleTask rightTask = new DoubleTask(numbers, mid, end);

            invokeAll(leftTask, rightTask); // দুই সাবটাস্ক একসাথে চালান
        }
    }
}

public class RecursiveActionExample {
    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();

        int[] numbers = new int[20];
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = i + 1;
        }

        DoubleTask task = new DoubleTask(numbers, 0, numbers.length);
        pool.invoke(task);

        System.out.println("Doubled Numbers:");
        for (int num : numbers) {
            System.out.print(num + " ");
        }
    }
}

RecursiveTask এবং RecursiveAction এর তুলনা

বৈশিষ্ট্যRecursiveTaskRecursiveAction
রিটার্ন মানএকটি মান প্রদান করেকোনো মান প্রদান করে না
ব্যবহারযেমন: গণনা, ফলাফল প্রয়োজন হলেযেমন: লিস্ট আপডেট বা ফাইল প্রক্রিয়া
উদাহরণযোগফল গণনা, ফ্যাক্টোরিয়ালমান ডাবল করা, ফাইল কপি

RecursiveTask এবং RecursiveAction এর সুবিধা

  1. কাজ ভাগ করা: বড় কাজগুলো ছোট টুকরোতে ভাগ করা হয়।
  2. প্যারালালিজম: কাজগুলো একাধিক থ্রেডে সমান্তরালভাবে চালানো হয়।
  3. Fork/Join Framework: এটি সহজ করে দেয় কনকারেন্সি কার্য সম্পাদন।

  • RecursiveTask ব্যবহার করুন যখন রিটার্ন মান প্রয়োজন।
  • RecursiveAction ব্যবহার করুন যখন শুধু কাজ সম্পন্ন করলেই হয়।
  • Fork/Join Framework বড় এবং জটিল কাজকে দ্রুত এবং কার্যকরভাবে সমাধান করতে সহায়ক।

সঠিকভাবে ব্যবহার করলে এটির মাধ্যমে মাল্টিথ্রেডিং প্রোগ্রামের পারফরম্যান্স উল্লেখযোগ্যভাবে উন্নত করা সম্ভব।

Content added By
Promotion

Are you sure to start over?

Loading...