异步化设计

总结

插件过滤使用单异步模式

请求响应使用双异步模式

单异步和双异步模式

单异步模式其实就是指你发送和接受请求的线程是同一个,那么你是没法同时发送和接受的

怎么实现双异步模式呢?

用不同的线程去发送接收请求

completableFuture演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package async;

import java.util.concurrent.*;
/**
* @author: lkl
* @date: 2025/7/12 17:20
* 说明单异步和双异步模式的区别
*/
public class CompletableFutureDemo {
public static void main(String[] args) {
//ExecutorService pool = Executors.newFixedThreadPool(1);
////单异步
//CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
// System.out.println("异步任务线程:" + Thread.currentThread().getName());
// return 10;
//},pool).thenApply(result -> {
// System.out.println("回调线程:" + Thread.currentThread().getName()); // 可能是主线程
// return result * 2;
//});
////双异步
//CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
// System.out.println("异步任务线程:" + Thread.currentThread().getName());
// return 10;
//},pool).thenApplyAsync(result -> {
// System.out.println("回调线程:" + Thread.currentThread().getName()); // 一定是异步线程
// return result * 2;
//},pool);


//单异步
CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> {
System.out.println("异步任务线程:" + Thread.currentThread().getName());
return 10;
}).thenApply(result -> {
System.out.println("回调线程:" + Thread.currentThread().getName()); // 可能是主线程
return result * 2;
});
//双异步
CompletableFuture<Integer> future4 = CompletableFuture.supplyAsync(() -> {
System.out.println("异步任务线程:" + Thread.currentThread().getName());
return 10;
}).thenApplyAsync(result -> {
System.out.println("回调线程:" + Thread.currentThread().getName()); // 一定是异步线程
return result * 2;
});

}
}

但其实也不是绝对,如果使用的线程池,线程有限,发送和接收也有可能用的同一个线程

使用线程池的时候记得关闭,不然main线程退出后,会由于还存在用户线程,导致程序卡住

thenApplyAsync和thenApply区别

https://segmentfault.com/q/1010000042935593

单异步和双异步的适用场景

如果我们的下游服务处理比较快,那么双异步模式就会比较吃亏,因为会频繁地进行上下文切换,这样耗时就

会比单异步的大

Future局限性和CompletableFuture使用

Future的局限性

CompletableFuture原理与实践-外卖商家端API的异步化

CompletableFuture使用:

创建异步线程

1
2
runAsync
applyAsync

获取结果

1
2
3
4
//
future.get()
//
future.jion()