Juc并发编程之CompletableFuture多任务并行

业务背景,在项目开发中,在一个方法中需要同时查询四个不同的远程接口,这个接口可以并行请求,但需要同时拿到四个接口返回的结果才能继续执行业务。很显然这种情况通过串行调用,肯定可以实现,但是这样会造成阻塞时间长,性能低。例如现在有四个方法及其调用时间:
在这里插入图片描述
如果串行调用,那么四个接口调用耗时:5+3+4+2 = 14s;

如果并行调用,那么四个接口调用耗时为:5s,时间节约9s

下面使用代码方式实现并行任务

1、定义业务类


public class TaskVO {
 
    private String  zgh;
 
    private String  xcx;
 
    private String app;
 
    private String  web;
}

2、多线程并行调用

    /***
     * 模拟耗时操作
     * @param s
     * @param flag
     */
    public  void   sleep(int s,String  flag){
        try {
            System.out.println(flag+"------start---"+dateFormat.format(new Date()));
            TimeUnit.SECONDS.sleep(s);
            System.out.println(flag+"------end-----"+dateFormat.format(new Date()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public   void   doVoidAllTask(){
        TaskVO taskVO = new TaskVO();
        long s = System.currentTimeMillis();
        System.out.println("start------start---"+dateFormat.format(new Date())+"----"+taskVO);
        CompletableFuture<Void> t1 = CompletableFuture.runAsync(() -> {
            sleep(5,"t1");
            taskVO.setApp("app");
        });
        CompletableFuture<Void> t2=  CompletableFuture.runAsync(() -> {
            sleep(3,"t2");
            taskVO.setZgh("gzh");
        });
        CompletableFuture<Void> t3=   CompletableFuture.runAsync(() -> {
            sleep(4,"t3");
            taskVO.setXcx("xcx");
        });
        CompletableFuture<Void> t4=   CompletableFuture.runAsync(() -> {
            sleep(2,"t4");
            taskVO.setWeb("web");
        });
        CompletableFuture<Void>[] completableFutures = Stream.of(t1, t2, t3,t4).collect(Collectors.toList()).toArray(new CompletableFuture[4]);
        /// t1  t2  t3  t4  全部并行执行结束时结束任务
        CompletableFuture.allOf(completableFutures).join();
        /// t1  t2  t3  t4  全部并行执行结束时结束任务
        ///CompletableFuture.allOf(completableFutures).join();
        long e = System.currentTimeMillis();
        System.out.println("total time :"+ (e-s));
        System.out.println("end------end---"+dateFormat.format(new Date())+"----"+taskVO);
    }
 
 

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟令杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值