07 ForkJoin
ForkJoin
什么是ForkJoin
ForkJoin在JDK1.7 并发执行任务!提高效率,大数据量!
大数据:Map Reduce(把大任务拆分成小任务)
ForkJoin特点:工作窃取
B线程执行完之后会去抢夺A线程的任务
这个里面维护的都是双端队列
如果使用ForkJoinPool通过它来执行
-
ForkJoinPool 通过它来执行
-
计算任务ForkJoinPool .execute(ForkJoinTask<?> task)
public class ForkJoinDemo extends RecursiveTask<Long> {
private Long start;
private Long end;
//临界值
private Long temp = 10000L;
public ForkJoinDemo(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 { //forkjoin 递归
long middle = (start + end) / 2;
ForkJoinDemo task1 = new ForkJoinDemo(start, middle);
task1.fork();
ForkJoinDemo task2 = new ForkJoinDemo(middle + 1, end);
task1.fork();//拆分任务 把任务压入线程队列
return task1.join() + task2.join();
}
}
}
public class Task {
public static void main(String[] args) throws ExecutionException, InterruptedException {
test1();
}
public static void test1() throws ExecutionException, InterruptedException {
long start = System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinDemo task = new ForkJoinDemo(0L, 10_0000L);
ForkJoinTask<Long> submit = forkJoinPool.submit(task);
Long sum = submit.get();
long end = System.currentTimeMillis();
System.out.println("sum=" + sum + "时间" + (end - start)) ;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)