阿里巴巴为什么不建议直接使用 Async 注解?
开发者技术前线
共 3959字,需浏览 8分钟
· 2021-08-09
点击“开发者技术前线”,选择“星标🔝”
让一部分开发者看到未来
![](https://filescdn.proginn.com/67fbe669ace1eaeb8a0fd796e5ab1c3c/241487ec50c137e95e2e1ceb25f0267d.webp)
应用场景
同步
异步
Spring 已经实现的线程池
SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,默认每次调用都会创建一个新的线程。 SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方。 ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类。 SimpleThreadPoolTaskExecutor:是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类。 ThreadPoolTaskExecutor :最常使用,推荐。其实质是对java.util.concurrent.ThreadPoolExecutor的包装。
最简单的异步调用,返回值为void 带参数的异步调用,异步方法可以传入参数 存在返回值,常调用返回Future
Spring中启用@Async
![](https://filescdn.proginn.com/1ed72537ce32dd764657fbd0826bdd8a/bb2f713668795b3b5eec7d43f03c4bbc.webp)
@Async应用默认线程池
无返回值调用
![](https://filescdn.proginn.com/9166129236c7faa426f7dab5f8d8d63f/ea9db5e40535df09aab7e11c104ad794.webp)
有返回值Future调用
![](https://filescdn.proginn.com/1d6a6f288f85793eca1da68872543832/9fc8f0027fcd96a0090240c6680724ff.webp)
有返回值CompletableFuture调用
CompletionStage代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段 一个阶段的计算执行可以是一个Function,Consumer或者Runnable。比如:
stage.thenApply(x -> square(x)).thenAccept(x -> System.out.print(x)).thenRun(() -> System.out.println())
一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发
它可能代表一个明确完成的Future,也有可能代表一个完成阶段( CompletionStage ),它支持在计算完成以后触发一些函数或执行某些动作。 它实现了Future和CompletionStage接口
![](https://filescdn.proginn.com/a0bb3810cb6477a9cb75f317f7760728/32af69afeb1298a1e4a83cfac20f5eab.webp)
默认线程池的弊端
newFixedThreadPool和newSingleThreadExecutor:主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。 newCachedThreadPool和newScheduledThreadPool:要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
@Async应用自定义线程池
重新实现接口AsyncConfigurer 继承AsyncConfigurerSupport 配置由自定义的TaskExecutor替代内置的任务执行器
实现接口AsyncConfigurer
![](https://filescdn.proginn.com/43b0a41d6ae011e5387bb91d880bae64/3efc7afeced47d0e7bc0ad30b5b61ae2.webp)
继承AsyncConfigurerSupport
![](https://filescdn.proginn.com/cf7305b5b3228d8fe92a00f2607cb773/f79893162002bc1f147bbe9b932e033b.webp)
配置自定义的TaskExecutor
Executor.class:ThreadPoolExecutorAdapter->ThreadPoolExecutor->AbstractExecutorService->ExecutorService->Executor
TaskExecutor.class:ThreadPoolTaskExecutor->SchedulingTaskExecutor->AsyncTaskExecutor->TaskExecutor
— 完 —
点这里👇关注我,记得标星呀~
前线推出学习交流一定要备注:研究/工作方向+地点+学校/公司+昵称(如JAVA+上海 扫码加小编微信,进群和大佬们零距离
END 后台回复“电子书” “资料” 领取一份干货,数百面试手册等 历史推荐
好文点个在看吧!
评论