ForkJoin Framework হলো জাভার কনকারেন্সি ফ্রেমওয়ার্কের একটি অংশ, যা জটিল টাস্কগুলোকে ছোট ছোট সাবটাস্কে বিভক্ত (divide) করে সমান্তরালভাবে (parallelly) এক্সিকিউট করার জন্য ব্যবহৃত হয়। এটি বিশেষত রিকার্সিভ ডিভাইড-অ্যান্ড-কনকার (divide-and-conquer) অ্যালগরিদমের জন্য কার্যকর।
ForkJoin Framework এর মূল ধারণা
- Fork: একটি বড় টাস্ককে ছোট ছোট সাবটাস্কে ভাগ করা।
- Join: সাবটাস্কগুলো শেষ হলে তাদের ফলাফল একত্রিত করা।
- Work Stealing: অব্যবহৃত থ্রেডগুলো অন্য ব্যস্ত থ্রেডের কাজ নিজেরা গ্রহণ করে।
ForkJoin Framework এর প্রয়োজনীয় ক্লাস
ForkJoinPool: এটি থ্রেড ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। এটি একটি বিশেষ থ্রেড পুল যা কাজের সমান্তরাল এক্সিকিউশন পরিচালনা করে।RecursiveTask<V>: এটি একটি কাজ সম্পন্ন করার পরে একটি রিটার্ন ভ্যালু প্রদান করে।RecursiveAction: এটি এমন কাজের জন্য ব্যবহৃত হয় যা কোনো রিটার্ন ভ্যালু প্রদান করে না।
ForkJoin Framework এর একটি সাধারণ উদাহরণ
১. রিকার্সিভ টাস্ক ব্যবহার করে গণনা (RecursiveTask Example)
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;
class SumTask extends RecursiveTask<Long> {
private static final int THRESHOLD = 10; // টাস্ক বিভক্ত করার জন্য থ্রেশহোল্ড
private final int start;
private final int end;
public SumTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if (end - start <= THRESHOLD) {
// ছোট টাস্ক সরাসরি হিসাব
long sum = 0;
for (int i = start; i <= end; i++) {
sum += i;
}
return sum;
} else {
// বড় টাস্ক ভাগ করা
int mid = (start + end) / 2;
SumTask leftTask = new SumTask(start, mid);
SumTask rightTask = new SumTask(mid + 1, end);
// সাবটাস্ক চালু করা
leftTask.fork();
rightTask.fork();
// ফলাফল সংগ্রহ
long leftResult = leftTask.join();
long rightResult = rightTask.join();
return leftResult + rightResult;
}
}
}
public class ForkJoinExample {
public static void main(String[] args) {
ForkJoinPool forkJoinPool = new ForkJoinPool();
// টাস্ক তৈরি
SumTask task = new SumTask(1, 100);
// টাস্ক চালু এবং ফলাফল সংগ্রহ
long result = forkJoinPool.invoke(task);
System.out.println("Sum from 1 to 100: " + result);
}
}
২. রিকার্সিভ অ্যাকশন ব্যবহার করে প্রিন্টিং (RecursiveAction Example)
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.ForkJoinPool;
class PrintTask extends RecursiveAction {
private static final int THRESHOLD = 10;
private final int start;
private final int end;
public PrintTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected void compute() {
if (end - start <= THRESHOLD) {
// সরাসরি প্রিন্ট করা
for (int i = start; i <= end; i++) {
System.out.println(Thread.currentThread().getName() + " printing: " + i);
}
} else {
// টাস্ক বিভক্ত করা
int mid = (start + end) / 2;
PrintTask leftTask = new PrintTask(start, mid);
PrintTask rightTask = new PrintTask(mid + 1, end);
invokeAll(leftTask, rightTask);
}
}
}
public class RecursiveActionExample {
public static void main(String[] args) {
ForkJoinPool forkJoinPool = new ForkJoinPool();
// টাস্ক তৈরি
PrintTask task = new PrintTask(1, 50);
// টাস্ক চালু করা
forkJoinPool.invoke(task);
}
}
ForkJoin Framework এর বৈশিষ্ট্য
- লক ফ্রি ডিজাইন: এটি থ্রেডের মধ্যে লকিং ছাড়া কাজ করে, যা পারফরম্যান্স বাড়ায়।
- ডিভাইড-অ্যান্ড-কনকার: বড় কাজকে ছোট অংশে ভাগ করার কৌশল।
- ওয়ার্ক স্টিলিং (Work Stealing): অলস থ্রেডগুলো ব্যস্ত থ্রেডের কাজ নিজেরা গ্রহণ করে।
ForkJoin Framework ব্যবহার করার সময় সতর্কতা
- টাস্কের আকার: টাস্ক ছোট হওয়া উচিত; অন্যথায় এটি বেশি সময় নেয়।
- রিকার্সিভ লেভেল: অযথা বেশি রিকার্সিভ কল করার কারণে স্ট্যাক ওভারফ্লো হতে পারে।
- থ্রেশহোল্ড সঠিকভাবে নির্ধারণ করুন: টাস্ক বিভক্ত করার থ্রেশহোল্ড ব্যালান্সড হওয়া উচিত।
ForkJoin Framework এর ব্যবহার ক্ষেত্র
- বড় ডেটা প্রক্রিয়াকরণ (Big Data Processing): ডেটা ভাগ করে দ্রুত প্রসেস করার জন্য।
- সমান্তরাল অ্যালগরিদম: যেমন, মার্স সার্ট বা কোয়িক সার্ট।
- গাণিতিক হিসাব: বড় পরিসরের যোগফল বা গাণিতিক অপারেশন পরিচালনা।
ForkJoin Framework জাভার কনকারেন্সি মডেলে একটি অত্যন্ত গুরুত্বপূর্ণ অংশ। এটি বড় কাজগুলোকে ছোট ছোট সাবটাস্কে ভাগ করে সমান্তরাল এক্সিকিউশন পরিচালনা করে, যা কর্মদক্ষতা এবং পারফরম্যান্স বৃদ্ধি করে। এটি বিশেষত ডিভাইড-অ্যান্ড-কনকার প্যাটার্নের জন্য উপযোগী।
Content added By
Read more