当前位置: 首页 > news >正文

FutureTask和CompletableFuture的模拟使用

 模拟了查询耗时操作,并使用FutureTask和CompletableFuture分别获取计算结果,统计执行时长

package org.alllearn.futurtask;import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.FutureTask;
import java.util.stream.Collectors;public class CompletableFutureTest {public static void main(String[] args) {CompletableFutureTest test = new CompletableFutureTest();List<User> users = test.getUsers();//流计算的简单使用Stopwatch started = Stopwatch.createStarted();double average = users.stream().mapToInt(User::getAge).average().getAsDouble();System.out.println(average + "  " + started.elapsed());//模拟通过id集合去其他表批量查询数据//单线程任务分割,数据库承受不了大量id的in查询List<List<User>> partition1 = Lists.partition(users, users.size() / 200);started.reset();started.start();double average1 = partition1.stream().mapToDouble(test::select).average().getAsDouble();System.out.println(average1 + "  " + started.elapsed());//多线程任务两种方案FutureTask、CompletableFutureint cpu = Runtime.getRuntime().availableProcessors();//计算密集型cpu+1,io密集型cpu*2ForkJoinPool forkJoinPool = new ForkJoinPool(cpu + 1);List<List<User>> partition2 = Lists.partition(users, users.size() / 200);//FutureTaskstarted.reset();started.start();double average2 = partition2.stream().map(u -> {FutureTask<Double> futureTask = new FutureTask<>(() -> test.select(u));forkJoinPool.submit(futureTask);return futureTask;}).collect(Collectors.toList()).stream().mapToDouble(f -> {try {return f.get();} catch (InterruptedException | ExecutionException e) {throw new RuntimeException(e);}}).average().getAsDouble();System.out.println(average2 + "  " + started.elapsed());//CompletableFuturestarted.reset();started.start();double average3 = partition2.stream().map(u -> CompletableFuture.supplyAsync(() -> test.select(u), forkJoinPool)).collect(Collectors.toList()).stream().mapToDouble(CompletableFuture::join).average().getAsDouble();forkJoinPool.shutdown();System.out.println(average3 + "  " + started.elapsed());}//模拟查询耗时public Double select(List<User> user) {try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}return 1D;//return Math.random();}//模拟获取用户public List<User> getUsers() {List<User> users = new ArrayList<>();for (int i = 0; i < 20000; i++) {users.add(new User(i, "user" + i, 1));}return users;}@Getter@Setter@AllArgsConstructorstatic class User {private int id;private String name;private int age;}}

http://www.lryc.cn/news/186681.html

相关文章:

  • Redis作为缓存,mysql的数据如何与redis进行同步?
  • 申请免费 SSL 证书为您的小程序加密通信
  • Go 并发编程
  • 鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结
  • es6 数据类型
  • 【postgresql】
  • 【C++】空间配置器 allocator:原理及底层解析
  • 微信小程序 movable-area 区域拖动动态组件演示
  • 隔离上网,安全上网
  • NOSQL Redis 数据持久化 RDB、AOF(二) 恢复
  • UDP通信
  • Bootstrap对溢出内容的两种处理:滚动条和隐藏两种方式
  • elasticsearch基本语法
  • Maven Spring jar包启动报错 排查
  • LeetCode-2485-找出中枢整数
  • nano pi m1配置脚本(全志H3)
  • linux--gdb的使用
  • JVM命令行监控工具
  • 系统架构设计:4 论微服务架构及其应用
  • 【C++设计模式之建造者模式:创建型】分析及示例
  • C++day03(动态内存、类中特殊成员函数)
  • 【Leetcode】179. 最大数
  • ArduPilot开源飞控之AP_Baro_MSP
  • openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw
  • UML图 - 类图(Class Diagram)
  • sheng的学习笔记-【中文】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第二周测验
  • Nacos 监控手册
  • 项目需求分析5大常见问题及解决方案
  • C#学习系列相关之多线程(四)----async和await的用法
  • 极智AI | 大模型优化之KV Cache