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