springboot异步的两种方法
1.使用springboot自带的异步
1. 在启动类中开启异步
加上注解:
@EnableAsync
2. 异步的类上需要加@Component,如果这个类是异步的话需要在类上加@Async
如果某个方法是则只需要在方法上加上注解
3.注意点:
1)要把异步任务封装到类里面,不能直接写到Controller
2)增加Future<String> 返回结果 AsyncResult<String>("task执行完成");
3)如果需要拿到结果 需要判断全部的 task.isDone()
4) @Async使用,必须是public方法 必须是非static方法,如果返回报错则是环绕增强的问题,需要返回对象,如Object
2.使用线程池异步
1. ThreadPoolUtils 工具类

import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolUtils { private static volatile ThreadPoolExecutor pool = null; public static ThreadPoolExecutor getThreadPool() { if (pool == null) { synchronized (ThreadPoolUtils.class) { if (pool == null) { pool = createPool(10, 100); } } } return pool; } /** * 创建线程池 * * @param corePoolSize 核心线程数量 * @param maxThreadSize 最大线程数 * @return */ private static ThreadPoolExecutor createPool(int corePoolSize, int maxThreadSize) { return new ThreadPoolExecutor(corePoolSize, maxThreadSize, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); } }
2. 使用线程池创建线程

ThreadPoolExecutor threadPool = ThreadPoolUtils.getThreadPool(); threadPool.submit(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return sendEmail("保险产品审核表",emails,"未审核的产品",is); } });
3. threadPool.submit()是可以获取返回结果的,call方法里返回的数据,
4. Feature feature = submit.get()
submit.get方法是一个阻塞方法,如果开启的线程内的逻辑没有处理完成,它会等开启的线程处理完成。
submit.get(10, TimeUnit.SECONDS)//设置线程的超时时间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构