Fork/Join
原理(需要继承(有返回值)RecursiveTask或者(没返回值)RecursiveAction,重写compute()方法)
将大任务拆分成小任务,先实现compute()方法。首先判断任务是否足够小,如果足够小就直接执行任务。如果不够小,就必须分割成两个子任务,每个子任务调用fork()方法时,又会进入compute()方法,递归下去。
工作窃取算法
异步调用
fork()方法
/**
* ForkJoinPool是由ForkJoinTask数组和ForkJoinWorkerThread数组组成。
* ForkJoinTask数组负责将存放程序提交给ForkJoinPool的任务
* ForkJoinWorkerThread数组负责(异步)执行这些任务
*/
public final ForkJoinTask<V> fork() {
Thread t;
if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread)
//将当前线程添加到一个工作队列中,然后ForkJoinWorkerThread异步执行这些任务。
((ForkJoinWorkerThread)t).workQueue.push(this);
else
ForkJoinPool.common.externalPush(this);
return this;
}
/**
* push()方法,将当前任务存放在ForkJoinTask数组队列中。然后再调用ForkJoinPool的signalWork()方法唤醒或创建
* 一个工作线程来执行任务。
*/
final void push(ForkJoinTask<?> task) {
ForkJoinTask<?>[] a; ForkJoinPool p;
int b = base