forkjoin使用实例
时间: 2023-09-09 09:06:08 浏览: 47
在Java中,`ForkJoinPool`和`ForkJoinTask`类可以用于并行执行任务。下面是一个使用`ForkJoinPool`和`ForkJoinTask`的示例:
```
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class ForkJoinExample {
public static void main(String[] args) {
ForkJoinPool forkJoinPool = new ForkJoinPool();
int result = forkJoinPool.invoke(new SumTask(1, 100));
System.out.println("Sum of 1 to 100 is " + result);
}
static class SumTask extends RecursiveTask<Integer> {
private static final int THRESHOLD = 10;
private int from;
private int to;
public SumTask(int from, int to) {
this.from = from;
this.to = to;
}
@Override
protected Integer compute() {
if (to - from <= THRESHOLD) {
int sum = 0;
for (int i = from; i <= to; i++) {
sum += i;
}
return sum;
} else {
int mid = (from + to) / 2;
SumTask leftTask = new SumTask(from, mid);
SumTask rightTask = new SumTask(mid + 1, to);
leftTask.fork();
rightTask.fork();
return leftTask.join() + rightTask.join();
}
}
}
}
```
在上面的示例中,我们创建了一个`SumTask`类,它继承了`RecursiveTask<Integer>`类。`RecursiveTask`是一个抽象类,我们需要实现`compute()`方法来完成我们的任务。
`SumTask`用于计算从`from`到`to`之间的整数的总和。如果`to - from`小于或等于一个固定的阈值(`THRESHOLD`),则任务将直接计算总和。否则,任务将被拆分成两个子任务并分别计算。我们使用`fork()`方法启动子任务,并使用`join()`方法等待子任务完成并返回结果。
在`main()`方法中,我们创建了一个`ForkJoinPool`来执行我们的任务,并使用`invoke()`方法启动任务。`invoke()`方法将阻塞直到任务完成,并返回结果。最后,我们打印出计算结果。
这是一个简单的使用`ForkJoinPool`和`ForkJoinTask`的示例。