java fork/join效率问题

qq412101450 2016-10-25 02:18:55
最近在研究java的fork/join模式。实现1到 2000000000的累加!贴上代码:
测试类:
public static void main(String[] args) throws InterruptedException, ExecutionException {
Long i = 1l;
Long j = 2000000000l;
Long sum = 0l;
Long startTime = System.currentTimeMillis();
for (; i <= j; i++) {
sum = sum + i;
}
Long endTime = System.currentTimeMillis();
System.out.println("sum : " + sum);
System.out.println("exec time : " + (endTime - startTime));
System.out.println("-----------------------------");
Long _startTime = System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
Future<Long> future = forkJoinPool.submit(new MyTask(1l, 2000000000l, 1000000000l));
System.out.println("sum : " + future.get());
Long _endTime = System.currentTimeMillis();
System.out.println("exec time : " + (_endTime - _startTime));
}
MyTask类:
public class MyTask extends RecursiveTask<Long> {

private static final long serialVersionUID = 4314829800606306387L;

Long start;
Long end;
Long max;

public MyTask(Long start, Long end, Long max) {
this.start = start;
this.end = end;
this.max = max;
}

@Override
protected Long compute() {
boolean flag = (end - start) <= max;
Long sum = 0l;
if (flag) {
for (; start <= end; start++) {
sum = sum + start;
}
} else {
Long middle = (start + end) / 2;
MyTask startTask = new MyTask(start, middle, max);
MyTask endTask = new MyTask(middle + 1, end, max);
startTask.fork();
endTask.fork();
sum = startTask.join() + endTask.join();
}
return sum;
}
}

执行结果:
sum : 2000000001000000000
exec time : 20008
-----------------------------
sum : 2000000001000000000
exec time : 27178

为什么用fork/join模式反而更慢?
...全文
306 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
休息的风 2016-10-25
  • 打赏
  • 举报
回复
因为用fork/join会创建多个线程去执行,线程上下文切换是会耗时的,cup时间轮转也是会耗时。你这个线程上下文切换的时间相对于计算的时间来说,还是比较多的。 所以为什么不能盲目的用线程,建议可以看下java并发编程艺术

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧