在 Linux 上用 Java 实现“定时任务”,常见有 几种方式,按使用场景从简单到生产级给你梳理一下。
import java.util.Timer;
import java.util.TimerTask;
public class Test {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("执行任务:" + new java.util.Date());
}
}, 0, 5000); // 延迟0ms,每5秒执行
}
}
✅ 简单
❌ 单线程、异常会停止、不适合复杂调度
import java.util.concurrent.*;
public class Test {
public public static void main(String[] args) {
ScheduledExecutorService executor =
Executors.newScheduledThreadPool(2);
executor.scheduleAtFixedRate(() -> {
System.out.println("任务执行:" + new java.util.Date());
}, 0, 5, TimeUnit.SECONDS);
}
}
✅ 线程安全
✅ 可控线程池
✅ 常用
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
@Component
public class Job {
@Scheduled(cron = "0 */1 * * * ?") // 每分钟
public void run() {
System.out.println("Spring 定时任务");
}
}
✅ 生产最常用
✅ 支持 cron、fixedRate、fixedDelay
适合:每天固定时间跑一次
javac Task.java
jar cvf task.jar Task.class
#!/bin/bash
java -jar /opt/java/task.jar >> /var/log/task.log 2>&1
crontab -e
0 2 * * * /opt/java/run.sh
✅ 稳定
✅ 不占内存
✅ 运维友好
JobDetail job = JobBuilder.newJob(MyJob.class).build();
Trigger trigger = TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?"))
.build();
✅ 支持集群
✅ 持久化
❌ 较重
✅ 可视化
✅ 分布式
✅ 高可用
| 场景 | 推荐方案 |
|---|---|
| 简单测试 | Timer |
| Java 内部定时 | ScheduledExecutor |
| Spring 项目 | @Scheduled |
| 每天跑脚本 | crontab |
| 分布式任务 | XXL-JOB / Quartz |
如果你能告诉我:
我可以直接给你 完整可运行示例。