异步调用方法提升接口效率

目录

前言

案例

结果


前言

假设我们的接口里需要调用两个方法,a方法耗时400ms,b方法耗时500ms。如果是使用同步调用这两个方法,一共要耗时900ms。用异步调用的话,只需要500ms。

什么是同步调用?什么是异步调用?

同步调用就是按照顺序一个一个地执行方法,而异步调用是同时执行方法。

 

同步:a方法先执行,b方法后执行,共耗时900ms。往往b方法是要依赖a方法的,例如需要先拿到a方法的结果,b方法才能执行。

 

异步:a方法,b方法同时进行,共耗时500ms。两个方法没有依赖关系,且耗时都比较长,可以考虑用异步调用提高效率。

案例

import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

@RestController
@RequiredArgsConstructor
public class DemoController {

    // 获取线程池对象
    private final ThreadPoolTaskExecutor threadPoolTaskExecutor;

    @GetMapping("/test1")
    public String demo1() throws InterruptedException {
        long begin = System.currentTimeMillis();
        // 同步调用
        Thread.sleep(400);// 方法a
        Thread.sleep(500);// 方法b

        long end = System.currentTimeMillis();
        long cost = end - begin;
        System.out.println("同步调用耗时:" + cost + "ms");
        return "同步调用耗时:" + cost + "ms";
    }

    @GetMapping("/test2")
    public String demo2() throws InterruptedException, ExecutionException {
        long begin = System.currentTimeMillis();
        // 异步调用
        CompletableFuture<Void> methodA = CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(400);// 方法a
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, threadPoolTaskExecutor);

        CompletableFuture<Void> methodB = CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(500);// 方法b
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, threadPoolTaskExecutor);
        // 等待完成
        CompletableFuture.allOf(methodA, methodB).get();

        long end = System.currentTimeMillis();
        long cost = end - begin;
        System.out.println("异步调用耗时:" + cost + "ms");
        return "异步调用耗时:" + cost + "ms";
    }
}

结果

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值