当前位置: 首页 > 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.xdnf.cn/news/1302697.html

相关文章:

  • 2025年机械制造、机器人与计算机工程国际会议(MMRCE 2025)
  • Docker Compose 入门教程
  • MySQL、PolarDB、PolarDB-X、TableStore、MongoDB、TiDB、ClickHouse选型
  • docker入门
  • Java 调用 Python 脚本:实现 HelloWorld
  • 计算机视觉(opencv)实战五——图像平滑处理(均值滤波、方框滤波、高斯滤波、中值滤波)附加:视频逐帧平滑处理
  • 从根本上解决MAC权限问题(关闭sip)
  • SSL和TLS协议的消息认证码(MAC)
  • Android RxJava变换操作符详解
  • 使用SQLALCHEMY的outerjoin时的bug
  • 训练大模型的前提:数据治理工程:从原始数据到高质量语料的系统化治理实践
  • vector接口模拟实现及其原理
  • Redis 官方提供免费的 30 MB 云数据库
  • 阿里云出里两款新的云服务器
  • Uniapp之微信小程序自定义底部导航栏形态
  • 订单簿数据智能解析深度学习算法筛选大单并预测即时价格变动
  • MuMu模拟器Pro Mac 安卓手机平板模拟器(Mac中文)
  • 智能家居【home assistant】(二)-集成xiaomi_home
  • 云原生俱乐部-k8s知识点归纳(3)
  • 【计算机视觉与深度学习实战】02基于形态学的权重自适应图像去噪系统
  • 自学大语言模型之Transformer的Tokenizer
  • Android 欧盟网络安全EN18031 要求对应的基本表格填写
  • 对抗损失(GAN)【生成器+判断器】
  • HarmonyOS 实战:用 List 与 AlphabetIndexer 打造高效城市选择功能
  • 【Java】HashMap的详细介绍
  • PCA降维全解析:从原理到实战
  • JAVA文件管理系统:如何玩转文件操作
  • CUDA中的基本概念
  • Scikit-learn (sklearn) 库详细介绍
  • 869. 重新排序得到 2 的幂