springboot线程池的使用方式2
一、简单介绍
方式1:Executors.newCachedThreadPool线程池。Executors有7种不同的线程池。
private static final ExecutorService executorService = Executors.newCachedThreadPool(new BasicThreadFactory.Builder() .namingPattern("create-card-thread-%d") .build()); CompletableFuture.runAsync(createCards(reqVO, buId), executorService) .whenComplete((Void v, Throwable t) -> { if (t == null) { log.info("create card complete.batchId={}", reqVO.getBatchId()); } else { log.error("create card failed.batchId={}", reqVO.getBatchId(), t); } try (ShardingCtx s = ShardingCtx.setShardingValue(buId)) { CustomerIntGencardLogPO updateLog = new CustomerIntGencardLogPO(); updateLog.setPk(gencardLogPO.getPk()) .setLastUpdated(LocalDateUtil.localDateTimeMinus8Hours(LocalDateTime.now())) .setGencardStatus(PROCESSED); customerIntGencardLogMapper.updateById(updateLog); } });
方式二:自定义线程池
注入:@Autowire @Resource
@Service public class AsyncService { @Autowired //1.注入自定义的线程池 Resource 重命名 @Resource(description = "taskExecutorTest") private ThreadPoolTaskExecutor threadPoolTaskExecutor; //自定义线程池 private static final ThreadPoolExecutor taskExecutor = new ThreadPoolExecutor(10, 20, 20, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(20), new ThreadPoolExecutor.CallerRunsPolicy()); public void addEventLog(String buId, String status) { CustomerEventLogPO customerEventLog = new CustomerEventLogPO(); customerEventLog.setStatus(status); customerEventLog.setCreated(LocalDateTime.now()); customerEventLogMapper.insert(customerEventLog); //submit有返回值, jdk8新写法 threadPoolTaskExecutor.submit(new Thread(() -> { customerEventLogMapper.insert(customerEventLog); })); //execute无返回值 threadPoolTaskExecutor.execute(new Thread(() -> { customerEventLogMapper.insert(customerEventLog); })); //老的写法 taskExecutor.execute(new Runnable() { @Override public void run() { try { studentscount = coursesService.getStudentCount(pd); } catch (Exception e) { e.printStackTrace(); } } }); } }
方式三:
springboot自带的异步线程池,在要异步的方法上直接加注解:
@Async("taskExecutor") taskExecutor是自定义的bean或者默认的。
@Async("taskExecutor") @DynamicDatasource public void addEventLog(String buId, String uuid, String evenType, String eventData, Exception e, String status){ CustomerEventLogPO customerEventLog = new CustomerEventLogPO(); customerEventLog.setUuid(uuid); customerEventLog.setEventType(evenType); customerEventLog.setEventData(eventData); customerEventLog.setStatus(status); customerEventLog.setDescripe(e != null ? e.getMessage() : ""); customerEventLog.setCreated(LocalDateTime.now()); customerEventLogMapper.insert(customerEventLog); }
方式四:
学海无涯 代码作伴
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南