博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java异步多线程编程探索之CompletableFuture
阅读量:5329 次
发布时间:2019-06-14

本文共 2721 字,大约阅读时间需要 9 分钟。

  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
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
* @param
* @return */ public static
CompletableFuture
asyncCall(Function
function,T t){ return supplyAsync(() -> function.apply(t)); } /** * 异步调用两个参数方法,有返回结果 * 例子: * CompletableFuture
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
* @return */ public static
CompletableFuture
asyncCall(BiFunction
function, T t,U u){ return supplyAsync(() -> function.apply(t,u)); } /** * 获取异步结果中的值(阻塞等待结果) * @param future * @param
* @return */ public static
T get(CompletableFuture
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
* @return 真实结果集合 */ public static
List
get(List
> futures){ if(CollectionUtils.isEmpty(futures)){ futures = new ArrayList<>(); } List
list = new ArrayList<>(futures.size()); //遍历获取结果集合 for (CompletableFuture
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

你可能感兴趣的文章
省市县,循环组装,整合大数组
查看>>
stm32中字节对齐问题(__align(n),__packed用法)
查看>>
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
spring-使用MyEcilpse创建demo
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>
linux下的静态库与动态库详解
查看>>
hbuilder调底层运用,多张图片上传
查看>>
较快的maven的settings.xml文件
查看>>
Git之初体验 持续更新
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
Maven之setting.xml配置文件详解
查看>>
SDK目录结构
查看>>
malloc() & free()
查看>>
HDU 2063 过山车
查看>>
高精度1--加法
查看>>
String比较
查看>>