Parallelism এর জন্য ForkJoinPool এর ব্যবহার

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

326

ForkJoinPool হলো জাভা কনকারেন্সি ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ অংশ, যা Divide and Conquer পদ্ধতির মাধ্যমে প্যারালেলিজম বা সমান্তরাল প্রক্রিয়াকরণ সক্ষম করে। এটি বড় কাজকে ছোট ছোট সাবটাস্কে বিভক্ত করে একাধিক থ্রেডে প্যারালেল প্রসেসিং করে।


ForkJoinPool এর বৈশিষ্ট্য

  1. Divide and Conquer প্যাটার্ন: বড় কাজ ছোট টাস্কে ভাগ হয়।
  2. Work Stealing Algorithm: যদি একটি থ্রেড কাজ শেষ করে ফেলে, এটি অন্য ব্যস্ত থ্রেডের কাজ গ্রহণ করতে পারে।
  3. RecursiveTask ও RecursiveAction: দুটি প্রধান ক্লাস ব্যবহৃত হয়:
    • RecursiveTask: রিটার্ন ভ্যালু সহ কাজের জন্য।
    • RecursiveAction: কোনো রিটার্ন ভ্যালু ছাড়া কাজের জন্য।

ForkJoinPool এর সাধারণ উদাহরণ

১. রিটার্ন ভ্যালু সহ (RecursiveTask)

যেমন: একটি সংখ্যার অ্যারেতে সমস্ত উপাদান যোগ করার কাজ।

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

class SumTask extends RecursiveTask<Integer> {
    private static final int THRESHOLD = 2; // কাজ ভাগ করার সীমা
    private final int[] numbers;
    private final int start;
    private final int end;

    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 ForkJoinSumExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        ForkJoinPool pool = new ForkJoinPool();
        SumTask task = new SumTask(numbers, 0, numbers.length);

        int result = pool.invoke(task);
        System.out.println("Sum of array elements: " + result);
    }
}

২. কোনো রিটার্ন ভ্যালু ছাড়া (RecursiveAction)

যেমন: একটি অ্যারের সব উপাদানকে ডাবল করা।

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

class DoubleArrayTask extends RecursiveAction {
    private static final int THRESHOLD = 2; // কাজ ভাগ করার সীমা
    private final int[] numbers;
    private final int start;
    private final int end;

    public DoubleArrayTask(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;
            DoubleArrayTask leftTask = new DoubleArrayTask(numbers, start, mid);
            DoubleArrayTask rightTask = new DoubleArrayTask(numbers, mid, end);

            // সাবটাস্ক শুরু
            invokeAll(leftTask, rightTask);
        }
    }
}

public class ForkJoinDoubleArrayExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        ForkJoinPool pool = new ForkJoinPool();
        DoubleArrayTask task = new DoubleArrayTask(numbers, 0, numbers.length);

        pool.invoke(task);

        // ফলাফল প্রিন্ট
        for (int num : numbers) {
            System.out.print(num + " ");
        }
    }
}

ForkJoinPool এর কাস্টমাইজেশন

ডিফল্ট থ্রেড সংখ্যা হল প্রসেসরের সংখ্যা। তবে, কাস্টম থ্রেড সংখ্যা সেট করা সম্ভব:

ForkJoinPool customPool = new ForkJoinPool(4); // ৪টি থ্রেড সহ কাস্টম পুল

ForkJoinPool ব্যবহার: মূল সুবিধা

  1. লক-ফ্রি পারফরম্যান্স: কাজ ভাগ করে প্রসেসরের ব্যবহার সর্বাধিক করা হয়।
  2. প্যারালেল প্রসেসিং: বড় কাজ দ্রুত সমাধান করার জন্য উপযোগী।
  3. ডাইনামিক ওয়ার্ক লোড ম্যানেজমেন্ট: Work Stealing Algorithm ব্যবহার করে।

ForkJoinPool এর সীমাবদ্ধতা

  1. Recursion Depth: গভীর রিকার্সন বেশি হলে স্ট্যাক ওভারফ্লো হতে পারে।
  2. সঠিক থ্রেশোল্ড নির্ধারণের প্রয়োজন: যদি থ্রেশোল্ড ঠিক না হয়, পারফরম্যান্স কমতে পারে।
  3. Shared Resource Deadlock: একই রিসোর্সে একাধিক থ্রেড কাজ করলে ডেডলক হতে পারে।

ForkJoinPool জাভার মাল্টিপ্রসেসিং টাস্ক পরিচালনার একটি শক্তিশালী টুল। এটি বড় এবং জটিল কাজ দ্রুত সমাধান করার জন্য ব্যবহৃত হয়। RecursiveTask এবং RecursiveAction ব্যবহার করে বড় কাজ সহজে ছোট ছোট সাবটাস্কে ভাগ করা যায় এবং সমান্তরালভাবে প্রক্রিয়াকরণ করা যায়।

Content added By
Promotion

Are you sure to start over?

Loading...