Java中实现定时器的常见方式
Java中实现定时器的常见方式如下,可根据具体场景选择合适方案:
一、基础线程实现
通过 Thread
和 sleep
方法周期性执行任务,适合简单场景:
public class SimpleTask {
public static void main(String[] args) {
Runnable task = () -> {
while (true) {
System.out.println("Task executed");
try {
Thread.sleep(1000); // 间隔1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
new Thread(task).start();
}
}
缺点:需手动控制线程生命周期,任务调度不够灵活。
二、Timer 和 TimerTask
java.util.Timer
结合 TimerTask
实现定时任务:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Task executed after 1s");
}
}, 1000); // 延迟1秒执行
// 周期性任务(间隔2秒)
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("Periodic task");
}
}, 0, 2000);
特点:
- 单线程执行,任务间可能相互阻塞;
- 适用于简单轻量级任务,不推荐复杂场景。
三、ScheduledExecutorService
ScheduledExecutorService
(基于线程池,推荐使用)
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
executor.schedule(() -> {
System.out.println("Delayed task");
}, 3, TimeUnit.SECONDS); // 延迟3秒执行
executor.scheduleAtFixedRate(() -> {
System.out.println("Fixed-rate task");
}, 0, 1, TimeUnit.SECONDS); // 初始延迟0秒,间隔1秒
executor.scheduleWithFixedDelay(() -> {
System.out.println("Fixed-delay task");
}, 0, 2, TimeUnit.SECONDS); // 任务结束到下次执行间隔2秒
优势:
- 支持线程池,避免单线程阻塞问题;
scheduleAtFixedRate
强调固定频率执行,scheduleWithFixedDelay
保证任务结束后的间隔。
四、Spring Task
通过 @Scheduled
注解实现(需配合 Spring 框架):
@Component
public class SpringTaskDemo {
@Scheduled(fixedRate = 1000) // 每秒执行一次
public void task() {
System.out.println("Spring Task executed");
}
@Scheduled(cron = "0/5 * * * * ?") // Cron表达式,每5秒一次
public void cronTask() {
System.out.println("Cron task");
}
}
配置:需在启动类添加 @EnableScheduling
。适用于 Spring/Spring Boot 项目。
五、分布式定时任务
复杂场景(如分布式集群)可选用:
- Quartz:支持任务持久化、复杂调度策略;
- XXL-Job:轻量级分布式任务调度平台;
- Elastic-Job:弹性分布式任务处理。
总结
- 简单任务:优先选择
ScheduledExecutorService
; - Spring 项目:直接使用
@Scheduled
注解; - 分布式环境:采用 Quartz 或 XXL-Job 等框架;
- 避免使用
Timer
处理高并发或耗时任务。