ForkJoin
作者:互联网
Fork/Join框架强调任务的分解。
该框架主要有Fork,join两个操作组成,Fork操作主要用于对任务和数据进行划分。join操作用于对各个部分的运行结果进行合并
该框架有一个重要的方法,叫做工作窃取法,当一个线程完成任务时,会去查看其它线程是否完成了任务,如果没有,就将窃取一部分任务来处理,提高效率和资源利用率
继承RecursiveTask类,重写compute方法。来创建线程任务
package com.luoKing.ForkJoin;
import java.util.concurrent.RecursiveTask;
public class ForkJTask extends RecursiveTask<Long>{
//计算1-10_0000_0000的和
//具体任务
private Long start;
private Long end;
private int temp = 5_0000;//门槛值
public ForkJTask(Long start, Long end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if((end-start)<temp){
Long sum = 0L;//总结果
for (Long i = start; i <= end; i++) {
sum +=i;
}
return sum;
}else{
Long middle = (start+end)/2;//中间值
ForkJTask task1 = new ForkJTask(start, middle);//任务1
task1.fork();//拆分任务,将线程压入队列
ForkJTask task2 = new ForkJTask(middle + 1, end);
task2.fork();
return task1.join()+task2.join();//合并结果
}
}
}
使用ForkJoinPool类来启动线程任务
package com.luoKing.ForkJoin;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
public class test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJTask forkJTask = new ForkJTask(0L,10_0000_0000L);
ForkJoinTask<Long> submit = forkJoinPool.submit(forkJTask);
System.out.println(submit.get());
}
}
Fork/Join框架的编程模式决定了它更适合具有递归操作的程序,通常需要程序员手动设置阈值。可操作性强
标签:end,ForkJoinPool,Long,util,start,import,ForkJoin 来源: https://www.cnblogs.com/luoking/p/16243695.html