java 多线程系列文章列表, 请查看目录: 《java 多线程学习笔记》
1. ForkJoinPool
java7 提供了ForkJoinPool 来支持将一个任务采用递归方式分成多个小任务计算, 然后再把小任务的计算结果合并为总的结果.
1.1 ForkJoinPool 的创建方式
- java7 提供了两个构造器:
- ForkJoinPool(int paralleism): 创建时指定并行线程数
- ForkJoinPool(): 以当前机器的cpu个数(Runtime.avaliableProcessors())作为并行参数
- java8 新增了静态方法创建通用池:
- ForkJoinPool.commomPool(): 返回一个通用池, 通用池状态不会受shutdown()和shutdownNow()方法影响.
- int getCommonPoolParallelism(): 返回通用池的并行线程数
1.2 子任务接口
ForkJoin 子任务有两种, 一种是没有返回值的, 一种是有返回值的. java 分别提供了对应的接口:
- RecursiveAction: 定义无返回值子任务应该实现的接口
- RecursiveTask: 定义有返回值子任务应该实现的接口
2. 无返回值ForkJoinPool 用法示例
2.1 创建子任务类
- 无返回值子任务需要集成RecursiveAction
- 需要指定拆分标准THRESHOLD, 明确开始计算的临界值
- 采用二分法进行子任务拆分
public class PrintTask extends RecursiveAction {
// 子任务拆分的标准
private static final int THRESHOLD = 3;
// 子任务处理的左临界值
private int start;
// 子任务处理的右临界值
private int end;
public PrintTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected void compute() {
// 如果起始值和结束值之间的差小于THRESHOLD, 则开始打印
if (end - start < THRESHOLD) {
for (int i = start; i < end; i++) {
System.out.println(Thread