当前位置: 首页 > news >正文

spring中异步任务注解@Async和@scheduled的使用

@Async 和 @Scheduled 都是 Spring 中处理异步任务的注解,但它们的设计目的、触发机制和使用场景有本质区别。以下是详细对比:


1. 核心目的不同

注解核心目的典型场景
@Async异步执行方法
立即返回结果,后台处理耗时操作
发送邮件、调用外部 API、日志记录
@Scheduled定时任务调度
按计划周期/延迟执行任务
数据清理、定时统计、心跳检测

2. 触发机制对比

@Async 触发方式
  • 被动触发:需要显式调用被注解的方法

  • 调用即触发:每次方法调用都会提交新任务到线程池

@Scheduled 触发方式
  • 主动触发:由 Spring 任务调度器自动触发

  • 无需调用:根据配置的时间规则自动执行

3. 配置方式对比

@Async 配置

java

@Configuration
@EnableAsync  // 启用异步支持
public class AsyncConfig {@Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);return executor;}
}
@Scheduled 配置

java

@Configuration
@EnableScheduling  // 启用定时任务支持
public class ScheduledConfig {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(5);return scheduler;}
}

4. 执行机制差异

特性@Async@Scheduled
线程模型使用线程池执行任务使用任务调度器执行
默认线程行为SimpleAsyncTaskExecutor(每次新线程)单线程执行(需配置线程池防阻塞)
任务依赖可通过 CompletableFuture 链式调用独立执行,无任务间依赖
异常处理需实现 AsyncUncaughtExceptionHandler直接在方法内 try-catch
任务取消可通过 Future.cancel() 取消通过 ScheduledFuture.cancel() 取消

5. 使用示例对比

@Async 示例

java

@Service
public class EmailService {@Async  // 异步执行public CompletableFuture<String> sendEmail(String content) {// 模拟耗时操作return CompletableFuture.completedFuture("发送成功: " + content);}
}// 调用方
CompletableFuture<String> future = emailService.sendEmail("Hello");
future.thenAccept(result -> System.out.println(result)); // 异步回调
@Scheduled 示例

java

@Service
public class CleanupService {@Scheduled(fixedRate = 30 * 60 * 1000) // 每30分钟执行一次public void clearTempFiles() {// 清理临时文件}@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行public void backupDatabase() {// 数据库备份}
}

http://www.lryc.cn/news/622022.html

相关文章:

  • 5G赋能井下“毛细血管”:巴拉素煤矿零散排水点智能监控系统
  • 基于阿里云音频识别模型的网页语音识别系统实现
  • Spring WebFlux 性能优化实践指南
  • 近日算法备案事项:九月批复审即将启动/赶11月批最后安全启动时间已过
  • week1-[顺序结构]跑道
  • YAML 中定义 List 的几种方式
  • WEB安全--Java安全--Servlet内存马
  • 第十四节:物理引擎集成:Cannon.js入门
  • Linux之高可用集群实战(二)
  • 机器学习 - Kaggle项目实践(4)Toxic Comment Classification Challenge 垃圾评论分类问题
  • 嵌入式第二十九课!!!回收子进程资源空间函数与exec函数
  • 大模型——如何让 AI 绘图的中文呈现更稳定和准确
  • Spring 条件注解与 SPI 机制(深度解析)
  • LeetCode 面试经典 150_数组/字符串_最长公共前缀(20_14_C++_简单)(暴力破解)(求交集)
  • Docker 实战:情感分析系统-容器化部署全流程(sa-logic、sa-webapp、sa-frontend )
  • Highcharts Dashboards | 打造企业级数据仪表板:从图表到数据驾驶舱
  • CUDA 编程笔记:GPU 硬件资源
  • 敏捷数据开发实践:基于 Amazon Q Developer + Remote MCP 构建本地与云端 Amazon Redshift 交互体系
  • mysql-条件查询案例
  • C++从入门到实战(十九)C++ vector容器及其常用接口
  • dockerfile自定义镜像,乌班图版
  • 【开源大模型和闭源大模型分别有哪些?两者的对比?部署私有化模型的必要性有哪些?】
  • 解决zabbix图片中文乱码
  • Spring Boot 拦截器详解
  • HarmonyOS Camera Kit 全解析:从基础拍摄到跨设备协同的实战指南
  • 开源 Arkts 鸿蒙应用 开发(十六)自定义绘图控件--波形图
  • 成品电池综合测试仪:一站式评估性能与安全
  • Flutter 以模块化方案 适配 HarmonyOS 的实现方法
  • 嵌入式学习日记(29)进程、线程
  • 一分钟了解EtherCAT 分支器