import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;
public class ForkJoinExample {
// 定义一个任务类,继承 RecursiveTask 并指定返回类型为 Integer
static class SumTask extends RecursiveTask<Integer> {
private static final int THRESHOLD = 10; // 阈值,当任务足够小的时候直接计算
private int[] numbers;
private int start;
private 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 middle = (start + end) / 2;
SumTask leftTask = new SumTask(numbers, start, middle);
SumTask rightTask = new SumTask(numbers, middle, end);
// 执行子任务并等待结果
leftTask.fork();
int rightResult = rightTask.compute();
int leftResult = leftTask.join();
return leftResult + rightResult;
}
}
}
public static void main(String[] args) {
int[] numbers = new int[100];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i + 1; // 初始化数组
}
// 创建 ForkJoinPool 实例
ForkJoinPool forkJoinPool = new ForkJoinPool();
// 提交任务并获取结果
SumTask task = new SumTask(numbers, 0, numbers.length);
int result = forkJoinPool.invoke(task);
System.out.println("Sum: " + result);
}
}
RecursiveTask 类:SumTask
继承自 RecursiveTask<Integer>
,表示这是一个可以返回 Integer
类型结果的任务。RecursiveTask
是 ForkJoinTask
的子类,用于定义可以递归拆分的任务。
阈值 (THRESHOLD):当任务的大小小于等于阈值时,任务将不再拆分,而是直接计算结果。这有助于避免过度拆分任务带来的额外开销。
compute 方法:这是任务的核心逻辑。如果任务足够小(即任务范围内的元素数量小于等于阈值),则直接计算结果;否则,将任务拆分为两个子任务,并使用 fork()
和 join()
来并行执行和合并结果。
ForkJoinPool:ForkJoinPool
是一个特殊的线程池,专门用于执行 ForkJoinTask
类型的任务。它能够有效地管理线程的创建和任务的调度,从而提高并行计算的效率。
任务提交与结果获取:通过 forkJoinPool.invoke(task)
提交任务并获取最终的结果。
这个例子展示了如何使用 Java 的 Fork/Join 框架来实现并行计算,特别适合处理大规模数据集或复杂计算任务。
上一篇:java命名
下一篇:string[] java
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站