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

Java实现定时任务的几种常见方式

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取


一、基础线程 + sleep 方法

原理:通过循环和线程休眠实现简单定时任务。

public class SimpleTimer {public static void main(String[] args) {Runnable task = () -> {while (true) {try {// 任务逻辑System.out.println("Task executed at " + new Date());Thread.sleep(5000); // 每5秒执行一次} catch (InterruptedException e) {e.printStackTrace();break;}}};new Thread(task).start();}
}

缺点:精度低、资源占用高,不推荐生产环境使用。


二、TimerTimerTask

原理:Java原生工具类,支持单线程调度任务。

import java.util.Timer;
import java.util.TimerTask;public class TimerDemo {public static void main(String[] args) {TimerTask task = new TimerTask() {@Overridepublic void run() {System.out.println("TimerTask executed at " + new Date());}};Timer timer = new Timer();// 延迟1秒后执行,每3秒重复一次timer.scheduleAtFixedRate(task, 1000, 3000);}
}

缺点:单线程执行,任务异常会导致后续任务终止。


三、ScheduledExecutorService

原理:线程池增强版,支持多线程和更灵活的调度。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ExecutorServiceDemo {public static void main(String[] args) {ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);Runnable task = () -> {System.out.println("Executor task at " + new Date());};// 延迟2秒后启动,每5秒执行一次executor.scheduleAtFixedRate(task, 2, 5, TimeUnit.SECONDS);}
}

优点:线程池管理、支持异常处理。


四、Spring 的 @Scheduled 注解

原理:Spring框架提供,通过注解简化配置。

  1. 启用定时任务(配置类):
@Configuration
@EnableScheduling
public class SpringConfig {}
  1. 定义定时任务类:
@Component
public class SpringTaskDemo {@Scheduled(fixedRate = 5000) // 每5秒执行一次public void scheduledTask() {System.out.println("Spring task at " + new Date());}@Scheduled(cron = "0 0 12 * * ?") // 每天中午12点执行public void cronTask() {System.out.println("Cron task executed.");}
}

需配置线程池(避免单线程阻塞):

# application.properties
spring.task.scheduling.pool.size=5

五、Quartz 框架

原理:企业级调度框架,支持复杂调度规则和持久化。

  1. 添加依赖:
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version>
</dependency>
  1. 实现任务逻辑:
public class QuartzJob implements Job {@Overridepublic void execute(JobExecutionContext context) {System.out.println("Quartz job executed at " + new Date());}
}
  1. 配置调度器:
public class QuartzDemo {public static void main(String[] args) throws SchedulerException {JobDetail job = JobBuilder.newJob(QuartzJob.class).withIdentity("myJob").build();Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()).build();Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.scheduleJob(job, trigger);scheduler.start();}
}

优势:分布式调度、持久化存储、动态配置。


六、对比与总结

方式适用场景优点缺点
基础线程简单测试无需依赖库精度低、资源浪费
Timer单任务轻量级调度原生支持单线程、异常敏感
ScheduledExecutor多任务需求线程池管理、灵活性强需手动管理生命周期
Spring @ScheduledSpring项目配置简单、集成方便依赖Spring框架
Quartz企业级复杂调度功能强大、支持持久化/分布式配置复杂、依赖库较多

选择建议

  • 简单任务:优先选择 ScheduledExecutorService 或 Spring @Scheduled
  • 复杂调度(如分布式):使用 Quartz
  • 避免使用 Timer 和基础线程方案

可根据项目规模和技术栈灵活选择最适合的方案。


如果您想获取更多优质资源,请关注我们

http://www.xdnf.cn/news/556219.html

相关文章:

  • 新闻媒体发稿:社会实践返家乡主题如何选择
  • 《扣子空间:开启AI智能体办公新时代》
  • DAY29 超大力王爱学Python
  • 理解阿里云的MQTT
  • 探秘「4+3原型驱动的交付模式」如何实现软件快速定制
  • MySQL 数据库迁移方法汇总
  • 第五届机器学习与智能系统工程国际学术会议(MLISE 2025)
  • vform自定义表单研究
  • 《算法笔记》11.8小节——动态规划专题->总结 问题 A: 第二题
  • OSA实战笔记一
  • LLM笔记(十一)常见解码/搜索算法
  • canvas浅析(一)
  • Java 09Stream流与File类
  • ragas precision计算的坑
  • 使用frp内网穿透本地的虚拟机
  • 几款常用的虚拟串口模拟器
  • springboot+vue3实现在线购物商城系统
  • MS16-075 漏洞 复现过程
  • Ai学习之openai api
  • 武汉火影数字|数字展厅展馆制作:沉浸式体验,全方位互动
  • Vue 3 深度解析:Composition API、Pinia状态管理与路由守卫实战
  • Rocketmq leader选举机制,通过美国大选解释
  • 第32节:基于ImageNet预训练模型的迁移学习与微调
  • 【MySQL】第六弹——表的CRUD进阶(四)聚合查询(下)
  • 图的几种存储方法比较:二维矩阵、邻接表与链式前向星
  • 人工智能驱动的制造业智能决策:从生产排程到质量闭环控制
  • 深度学习-mmcv中build_runner实例化全流程详解
  • EtherCAT通信协议
  • 【Netty】- NIO基础2
  • 易境通海外仓系统PDA蓝牙面单打印:解锁库内作业新姿势