车驰夜幕|面试官:java8中parallelStream提升数倍查询效率是怎样实现的( 二 )


4、Predicate : 断言型接口 boolean test(T t);
这四大核心函数式接口其下还有很多子接口 , 基本上能满足日常项目所用 , 这里扯远了 。。直接上代码 。
这里我们需要使用的是Runable接口 , 是无参无返回值的一个接口 。 在实际场景中 , 可能有时间范围之类的查询参数的 , 则可以根据不同业务使用不同的接口 。 这种方式也可以用Future接口去实现 , 有兴趣的可以试一试 , 这里就不多做叙述了 。
@org.junit.Testpublic void collect() {System.out.println("数据汇总开始");long startTime = System.currentTimeMillis();Result result = new Result();List taskList = new ArrayList() {{add(() -> result.setOnlineUser(queryOnlineUser()));add(() -> result.setRegistered(queryRegistered()));add(() -> result.setOrderAmount(queryOrderAmount()));add(() -> result.setOutlayAmount(queryOutlayAmount()));}};taskList.parallelStream().forEach(v -> v.run());long endTime = System.currentTimeMillis();System.out.println("获取汇总数据结束 , result = " + result);System.out.println("总耗时 = " + (endTime - startTime) + "毫秒");}执行结果,由于四个子任务都是并行的 , 效率直接提升了三倍 , 如果子任务越多的话提升效果越明显 。
数据汇总开始查询在线人数 耗时2秒查询注册人数 耗时2秒查询订单总额 耗时3秒查询支出总额 耗时3秒获取汇总数据结束 , result = Test.Result(onlineUser=10, registered=10086, orderAmount=2000, outlayAmount=1000)总耗时 = 3079毫秒总结1.parallelStream是异步编程的好帮手 , 在使用过程中一定要注意线程安全的问题 。
2.以上这种方式只能用在没有事务的业务中 , 因为在多线程中 , 事务是不共享的 。
车驰夜幕|面试官:java8中parallelStream提升数倍查询效率是怎样实现的