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 এর তুলনা
| বৈশিষ্ট্য | RecursiveTask | RecursiveAction |
|---|---|---|
| রিটার্ন মান | একটি মান প্রদান করে | কোনো মান প্রদান করে না |
| ব্যবহার | যেমন: গণনা, ফলাফল প্রয়োজন হলে | যেমন: লিস্ট আপডেট বা ফাইল প্রক্রিয়া |
| উদাহরণ | যোগফল গণনা, ফ্যাক্টোরিয়াল | মান ডাবল করা, ফাইল কপি |
RecursiveTask এবং RecursiveAction এর সুবিধা
- কাজ ভাগ করা: বড় কাজগুলো ছোট টুকরোতে ভাগ করা হয়।
- প্যারালালিজম: কাজগুলো একাধিক থ্রেডে সমান্তরালভাবে চালানো হয়।
- Fork/Join Framework: এটি সহজ করে দেয় কনকারেন্সি কার্য সম্পাদন।
RecursiveTaskব্যবহার করুন যখন রিটার্ন মান প্রয়োজন।RecursiveActionব্যবহার করুন যখন শুধু কাজ সম্পন্ন করলেই হয়।- Fork/Join Framework বড় এবং জটিল কাজকে দ্রুত এবং কার্যকরভাবে সমাধান করতে সহায়ক।
সঠিকভাবে ব্যবহার করলে এটির মাধ্যমে মাল্টিথ্রেডিং প্রোগ্রামের পারফরম্যান্স উল্লেখযোগ্যভাবে উন্নত করা সম্ভব।
Content added By
Read more