java多线程中的Fork和Join
文章目录
- 1. 简介
- 2. 使用
1. 简介
Fork/Join是JDK 1.7中加入的新的线程池的实现,它体现的使用分治的思想,适用于能够进行任务拆分的cpu密集型任务。所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直到不能拆分可以直接求解。Fork/Join载分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率。Fork/Join默认会创建于cpu核心大小相同的线程池。
2. 使用
public class TestFinal {
public static void main(String[] args) {
//创建线程池,里面有四个线程
ForkJoinPool pool = new ForkJoinPool(4);
//执行任务
System.out.println(pool.invoke(new MyTask(5)));
/**
* 任务拆分 new MyTask(5)= 5+ {new MyTask(4)=4+new MyTask(3)....}
*/
}
}
//1. 继承父类RecursiveTask,范型时Integer即任务结果的返回值,下面任务时计算1-100的和
class MyTask extends RecursiveTask<Integer> {
private int n;
public MyTask(int n) {
this.n = n;
}
@Override
protected Integer compute() {
if (n == 1) {
return 1;
}
MyTask myTask = new MyTask(n - 1);
myTask.fork(); //让另外一个线程去执行这个结果
int result = n + myTask.join(); //获取另一个线程的结果
return result;
}
}
任务执行的结果实际如下所示: