Fork/Join
Fork/Join 用于能够进行任务拆分的 cpu 密集型运算
跟递归相关的一些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解 Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率
Fork/Join 默认会创建与 cpu 核心数大小相同的线程池
提交给 Fork/Join 线程池的任务需要继承 RecursiveTask(有返回值)或 RecursiveAction(没有返回值)
下面定义了一个对 1~n 之间的整数求和的任务:
public class Test09 {
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool(4);
System.out.println(pool.invoke(new AddTask1(5)));
}
}
@Slf4j
class AddTask1 extends RecursiveTask<Integer> {
int n;
public AddTask1(int n) {
this.n = n;
}
@Override
public String toString() {
return "{" + n + '}';
}
@Override
protected Integer compute() {
// 如果 n 已经为 1,可以求得结果了
if (n == 1) {
log.debug("join() {}", n);
return n;
}
// 将任务进行拆分(fork)
AddTask1 t1 = new AddTask1(n - 1);
t1.fork();
log.debug("fork() {} + {}", n, t1);
// 合并(join)结果
int result = n + t1.join();
log.debug("join() {} + {} = {}", n, t1, result);
return result;
}
}
输出:
11:25:13.918 [ForkJoinPool-1-worker-1] DEBUG com.lhs.n1.AddTask1 - fork() 5 + {4}
11:25:13.918 [ForkJoinPool-1-worker-4] DEBUG com.lhs.n1.AddTask1 - fork() 2 + {1}
11:25:13.918 [ForkJoinPool-1-worker-3] DEBUG com.lhs.n1.AddTask1 - fork() 3 + {2}
11:25:13.918 [ForkJoinPool-1-worker-2] DEBUG com.lhs.n1.AddTask1 - fork() 4 + {3}
11:25:13.926 [ForkJoinPool-1-worker-1] DEBUG com.lhs.n1.AddTask1 - join() 1
11:25:13.926 [ForkJoinPool-1-worker-4] DEBUG com.lhs.n1.AddTask1 - join() 2 + {1} = 3
11:25:13.926 [ForkJoinPool-1-worker-3] DEBUG com.lhs.n1.AddTask1 - join() 3 + {2} = 6
11:25:13.926 [ForkJoinPool-1-worker-2] DEBUG com.lhs.n1.AddTask1 - join() 4 + {3} = 10
11:25:13.926 [ForkJoinPool-1-worker-1] DEBUG com.lhs.n1.AddTask1 - join() 5 + {4} = 15
15