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

目录

前言

案例

结果


前言

假设我们的接口里需要调用两个方法,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";
    }
}

结果

猜你喜欢

转载自blog.csdn.net/qq_74312711/article/details/134955633