Java异步编程探索之CompletableFuture

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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){
        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){
        List<T> list = CollectionUtil.createArrayList();

        //遍历获取结果集合
        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;
    }


}
 

这个工具使用在遍历集合处理数据或调用接口的使用,异步执行任务,最后归并任务,提升执行性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值