介绍
上个礼拜我们线上有个接口比较慢,这个接口在刚开始响应时间是正常的。但随着数据量的增多,响应时间变慢了。
这个接口里面顺序调用了2个服务,且2个服务之间没有数据依赖。我就用CompletableFuture把调用2个服务的过程异步化了一下,响应时间也基本上缩短为原来的一半,问题解决。
正好上次分享了函数式接口和Stream的使用,这次就分享一下CompletableFuture,里面也用到了大量的函数式接口
想方便的异步执行任务,就必须放到单独的线程中。继承Thread类,实现Runnable都不能拿到任务的执行结果,这时就不得不提创建线程的另一种方式了,实现Callable接口。
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}
Callable接口一般配合ExecutorService来使用
// ExecutorService.java
<T> Future<T> submit(Callable<T> task);
ExecutorService executor = Executors.newCachedThreadPool();
Future<Integer> result = executor.submit(() -> {
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i; } return sum;
});// 4950
System.out.println(result.get());
我们从Future中获取结果
public interface Future<V> {
// 取消任务的执行
boolean cancel(boolean mayInterruptIfRunning); // 任务是否已经取消
boolean isCancelled(); // 任务是否已经完成
boolean isDone(); // 获取任务执行结果,会阻塞线程
V get() throws InterruptedException, ExecutionException; // 超时获取任务执行结果,会阻塞线程
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutExcep