大家好,又见面了,我是你们的朋友全栈君。
分而治之
的思想,把一个大任务拆分成一个个小任务,然后再聚合,得到最终结果。这有点像Hadoop中的MapReduce。还支持工作窃取。这个Jar包下载地址: https://sourceforge.net/projects/javaconcurrenta/files/,还有很多有意思的动画,帮助我们学习JUC。
什么是工作窃取:假设有A、B两个线程执行一个任务,A比较快,把活儿干完了,这时候A可以把B的一部分活接过来。这样总体来说会加快任务执行速度。
17000003
条数据。如果我直接用SQL统计很慢,如下图所示。
1000000
条还是很快的,如下图所示。
...省略...
@Override
public long sumRecord(int toId, int fromId) {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
// 用in语句合并成一条SQL,避免多次请求数据库的IO
queryWrapper.ge("id", fromId);
queryWrapper.le("id", toId);
queryWrapper.select("IFNULL(SUM(money),0) as money");
List<Users> users = usersMapper.selectList(queryWrapper);
if (!CollectionUtils.isEmpty(users)) {
return users.get(0).getMoney();
}
return 0;
}
...省略...
...省略...
@Test
public void sumTask() {
long startTime = System.currentTimeMillis();
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
// 模拟千万数据
int min = 1;
int max = 17000003;
SumTask sumTask = new SumTask(min, max, userService);
pool.invoke(sumTask);
System.out.println("总数 " + sumTask.join() +
" 执行时间 " + (System.currentTimeMillis() - startTime));
}
public static final Integer THRESHOLD = 1000000;
public static class SumTask extends RecursiveTask<Long> {
int fromId;
int toId;
private UserService userService;
public SumTask(int fromId, int toId, UserService userService) {
this.fromId = fromId;
this.toId = toId;
this.userService = userService;
}
@Override
protected Long compute() {
if (toId - fromId < THRESHOLD) {
return sumRecord(toId, fromId);
} else {
int mid = (fromId + toId) / 2;
SumTask left = new SumTask(fromId, mid, userService);
SumTask right = new SumTask(mid + 1, toId, userService);
invokeAll(left, right);
return left.join() + right.join();
}
}
public Long sumRecord(int toId, int fromId) {
System.out.println(" 参数 " + fromId + " " + toId);
return userService.sumRecord(toId, fromId);
}
}
...省略...
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/191276.html原文链接:https://javaforall.cn