CompletableFuture是JDK1.8新增的一个异步执行任务类,可以发挥多核CPU的优势,也可以将任务并行执行,最后归并结果,下面是一个工具类,这个工具类使用在遍历集合处理数据或调用接口时,异步执行任务,最后归并任务,提升执行性能,具体代码如下。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.function.BiFunction;
import java.util.function.Function;/*** 异步执行工具类 继承 CompletableFuture* @author yangchangkui*/
public class AsyncUtil extends CompletableFuture {private static final Logger logger = LoggerFactory.getLogger(AsyncUtil.class);/*** 异步调用单个参数方法,有返回结果* 例子:* CompletableFuture<R> future = AsyncUtil.asyncCall((t)->{*      // do something ...*      return result;*  },t)* //阻塞获取结果* AsyncUtil.get(future)** 底层使用:*    private static final Executor asyncPool = useCommonPool ? ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();* @param function Function<T,R>* @param <T>* @return*/public static  <T,R> CompletableFuture<R> asyncCall(Function<T,R> function,T t){return supplyAsync(() -> function.apply(t));}/*** 异步调用两个参数方法,有返回结果* 例子:* CompletableFuture<R> future = AsyncUtil.asyncCall((t,u) -> {*          //do something ...**          return result;*      }, t,u);** //阻塞获取结果* AsyncUtil.get(future)** 底层使用:*     private static final Executor asyncPool = useCommonPool ? ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();* @param function* @param <T>* @return*/public static  <T, U, R> CompletableFuture<R> asyncCall(BiFunction<T, U, R> function, T t,U u){return supplyAsync(() -> function.apply(t,u));}/*** 获取异步结果中的值(阻塞等待结果)* @param future* @param <T>* @return*/public static  <T> T get(CompletableFuture<T> future){if(future == null){future = new CompletableFuture<>();}try {return future.get();} catch (InterruptedException ie) {logger.error("future.get interruptedException",ie);} catch (ExecutionException ee) {logger.error("future.get executionException",ee);}return null;}/*** 获取结果异步集合中的结果集合(阻塞等待结果)* @param futures* @param <T>* @return 真实结果集合*/public static  <T> List<T> get(List<CompletableFuture<T>> futures){if(CollectionUtils.isEmpty(futures)){futures =  new ArrayList<>();}List<T> list = new ArrayList<>(futures.size());//遍历获取结果集合for (CompletableFuture<T> future : futures) {try {T t = future.get();list.add(t);} catch (InterruptedException ie) {logger.error("future.get interruptedException",ie);} catch (ExecutionException ee) {logger.error("future.get executionException",ee);}}return list;}}

转载于:https://www.cnblogs.com/yangchangkui/p/10923195.html

Java异步多线程编程探索之CompletableFuture相关推荐

  1. Springboot异步多线程编程

    文章目录 一.基础知识 二.什么时候用同步&异步 三.什么时候需要使用多线程 四.springboot异步多线程编程实现 一.基础知识 同步:同步就是指一个进程在执行某个请求的时候,若该请求需 ...

  2. 【JAVA】多线程编程实现实例(全面实现)

    首先,我们我们要进行多线程编程,最少线程怎么创建时最基本的知识. 创建线程由四种方式 1.继承Thread类创建线程(重写run方法,用start()开启线程) 2.实现Runable接口创建线程(重 ...

  3. java异步多线程 判断线程状态_java多线程和异步回调

    在实际开发过程中遇到的多线程情况不多,但是在生产环境中多线程是最基本的情况,java面试时也会考到,所以看看多线程的知识还是很有必要的. Thread,Runnable,Callable,Future ...

  4. java高级-多线程编程

    2019独角兽企业重金招聘Python工程师标准>>> 一.进程和线程 在java语言中最大的特点就是支持多线程的开发(也是为数不多支持多线程开发的语言),如果对多线程没有一个全面而 ...

  5. java中多线程编程案例_Java中多线程编程实战的实现线程_Java编程_Java程序员_课课家...

    java编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的.尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有一些概念需要掌握.要记住的一件重要的事情是 main() 函数也是 ...

  6. 【Java】多线程编程

    1进程和线程 进程:一个进程就是一个执行中的程序.每一个进程都有自己独立的一块内存空间,一组系统资源. 线程:线程就是进程中的一个负责程序执行的控制单元(执行路径).同类的多个线程是共享一块内存空间和 ...

  7. Java利用多线程编程实现一个正在旋转的地球

    代码有冗余,但是实现了旋转地球的多线程打印 import java.applet.*; import java.awt.*; import java.util.*;public class Eeart ...

  8. Java 线程多线程编程2---线程同步

    来模拟一个死锁(互相等待): TestDeadLock.java package com.zhj.www;public class TestDeadLock implements Runnable { ...

  9. Java 线程多线程编程3---线程同步之生产者与消费者问题

    生产者与消费者问题: 第一步:把架子搭起来 package com.zhj.www;public class ProceduerConsumer {public static void main(St ...

  10. Java 线程多线程编程1---基础

    1.线程的基本概念 例子: 分析: 2.线程的创建和启动 第一种线程的创建: 定义一个线程类来实现Runner接口 例子: package com.zhj.www; import java.lang. ...

最新文章

  1. SD-WAN — 应用场景
  2. UI设计十戒--设计师的艺术
  3. SpringBoot一个依赖搞定Session共享,没有比这更简单的方案了!
  4. Swift之五个让Swift代码更加优雅的扩展
  5. android sqlite更改数据,更新现有的sqlite数据库中的列,但没有任何更改android
  6. java 读取split_Java报错系列——split
  7. extjs tree 遍历树节点并设置选中
  8. python中loop的用法_python-在Tensorflow中使用tf.while_loop更新变量
  9. androidx86安装pc后无法联网_Ubuntu 16.04 安装显卡驱动后循环登录和无法设置分辨率的一种解决方案
  10. opencv和python是什么关系_使用OpenCV和Python检测眼睛
  11. java虚拟机手动内存分配_《深入理解java虚拟机》-垃圾收集器与内存分配策略
  12. c# 多线程 执行事件 并发_阿里P9大牛对多线程并发问题的一些总结
  13. 银行支付系统大小额(一代支付)、超级网银(二代支付)
  14. 全球领导人齐聚一堂,出席10月14日召开的2021年全球包容性增长峰会
  15. QQ正式推出“超级QQ秀”布局元宇宙
  16. 【用Python对全职高手小说分析分词词频词性,小说人物出场次数排序,小说中食物排序,小说人物关系等等】
  17. Excel加密文档 加密保护破解方法 亲测有效
  18. 微信小游戏制作大厅里的排行榜(跟游戏内的排行榜有区别)
  19. mysql对表中添加属性_MySQL数据库增删改字段(属性)
  20. VB.net读取Outlook签名

热门文章

  1. 磊科nw336+linux驱动程序,磊科NW336无线网卡驱动程序
  2. arcgis制作空间变化图怎么做_Arcgis专题地图的编制
  3. word中插入代码_如何在Word中优雅的插入公式
  4. python网站开发实例 flask_Python Web开发之——构建基于Flask框架的web后端项目
  5. c语言中fprintf的作用,C语言中的printf(),sprintf()和fprintf()
  6. java所有代码都需要编译吗_为什么要编译此Java代码?
  7. 谷歌浏览器的笔记在哪里_selenium学习笔记之启动谷歌浏览器
  8. lambda表达式python_python lambda表达式用法
  9. hdoj2044:一只小蜜蜂(递推)
  10. 华为hs8545m如何复位_在华为东莞松山湖基地,见证一场始于AI质检的智能制造变革...