今天这篇文章介绍七种常见的Spring Boot 性能优化方向
1. 异步执行
实现方式二种:
-
使用异步注解
@Aysnc
、启动类:添加@EnableAsync
注解 -
JDK 8 本身有一个非常好用的 Future 类——
CompletableFuture
@AllArgsConstructor
public class AskThread implements Runnable{
private CompletableFuture<Integer> re = null;
public void run() {
int myRe = 0;
try {
myRe = re.get() * re.get();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(myRe);
}
public static void main(String[] args) throws InterruptedException {
final CompletableFuture<Integer> future = new CompletableFuture<>();
new Thread(new AskThread(future)).start();
//模拟长时间的计算过程
Thread.sleep(1000);
//告知完成结果
future.complete(60);
}
}
在该示例中,启动一个线程,此时 AskThread
对象还没有拿到它需要的数据,执行到 myRe = re.get() * re.get()
会阻塞。
我们用休眠 1 秒来模拟一个长时间的计算过程,并将计算结果告诉 future
执行结果,AskThread
线程将会继续执行。
public class Calc {
public static Integer calc(Integer para) {
try {
//模拟一个长时间的执行
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return para * para;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
final CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> calc(50))
.thenApply((i) -> Integer.toString(i))
.thenApply((str) -> "\"" + str + "\"")
.thenAccept(System.out::println);
future.get();
}
}
CompletableFuture.supplyAsync
方法构造一个 CompletableFuture
实例,在 supplyAsync()
方法中,它会在一个新线程中,执行传入的参数。
在这里它会执行 calc()
方法,这个方法可能是比较慢的,但这并不影响 CompletableFuture
实例的构造速度,supplyAsync()
会立即返回。
而返回的 CompletableFuture
实例就可以作为这次调用的契约,在将来任何场合,用于获得最终的计算结果。
supplyAsync
用