fork-join框架:https://blog.csdn.net/tyrroo/article/details/81390202
fork-join主要是cpu密集型的,cpu核心数和线程数是一样的。
返回值指的是方法的返回值。
---232---
代码:
package cn.itcast.n8;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
@Slf4j(topic = "c.TestForkJoin2")
public class TestForkJoin2 {
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool(4);// 4个线程的线程池
System.out.println(pool.invoke(new MyTask(5)));
// new MyTask(5) 5+ new MyTask(4) 4 + new MyTask(3) 3 + new MyTask(2) 2 + new MyTask(1)
}
}
// 1~n 之间整数的和 recursive的本意是递归的意思
@Slf4j(topic = "c.MyTask")
class MyTask extends RecursiveTask<Integer> {
private int n;
public MyTask(int n) {
this.n = n;
}
@Override
public String toString() {
return "{" + n + '}';
}
@Override
protected Integer compute() {
// 如果 n 已经为 1,可以求得结果了。
if (n == 1) {
System.out.println("join() {}"+n);
return n;
}
// 将任务进行拆分(fork)
// AddTask1 t1 = new AddTask1(n - 1);
MyTask t1 = new MyTask(n - 1);
t1.fork();
System.out.println("fork() {} + {}"+n+" "+t1);
// 合并(join)结果
int result = n + t1.join();
System.out.println("join() {} + {} = {}"+n+" "+t1+" "+result);
return result;
}
}
其中{4}代表任务4。
前面的worker是线程的。
新线程执行。
花括号是任务 实现是任务的拆分 虚线是返回的结果 t是线程
这个会一个任务依赖于另外的一个任务这样并行度是不够的。
---233---
拆分的手段进行改进。
之前就是任务5等待任务4的结果,任务4等待任务3的结果。一个任务依赖于另外一个任务。
就是比如5求和,就是拆分为1到3求和,和4到5求和。
---234---