总结
插件过滤使用单异步模式
请求响应使用双异步模式
单异步和双异步模式

单异步模式其实就是指你发送和接受请求的线程是同一个,那么你是没法同时发送和接受的
怎么实现双异步模式呢?
用不同的线程去发送接收请求
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 3 4
| // future.get() // future.jion()
|