在 Java 中,ExecutorService 本身并不是专门用来做定时任务的,它主要用于线程池管理。如果你要做定时 / 周期性任务,通常有两种方式:
ScheduledExecutorServiceScheduledExecutorService 是 ExecutorService 的子接口,专门用来做定时任务。
import java.util.concurrent.*;
public class Demo {
public static void main(String[] args) {
ScheduledExecutorService executor =
Executors.newScheduledThreadPool(2);
executor.schedule(() -> {
System.out.println("5秒后执行");
}, 5, TimeUnit.SECONDS);
executor.shutdown();
}
}
executor.scheduleAtFixedRate(
() -> System.out.println("执行任务"),
1, // 初始延迟
3, // 每隔3秒
TimeUnit.SECONDS
);
⚠️ 如果任务执行时间 > 周期,会立即开始下一次
executor.scheduleWithFixedDelay(
() -> {
System.out.println("执行任务");
},
1, // 初始延迟
3, // 上一次结束后等3秒
TimeUnit.SECONDS
);
✅ 更适合耗时不稳定的任务
ExecutorService 自己写定时ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
while (!Thread.currentThread().isInterrupted()) {
Thread.sleep(1000);
System.out.println("每秒执行");
}
});
❌ 缺点:
| 对比项 | ScheduledExecutorService | Timer |
|---|---|---|
| 多线程 | ✅ | ❌ |
| 异常容错 | ✅ | ❌ |
| 推荐程度 | ⭐⭐⭐⭐⭐ | ⭐ |
如果是 Spring 项目,更推荐:
@Scheduled(fixedRate = 3000)
public void task() {}
✅ 定时任务请用 ScheduledExecutorService
❌ 不要用普通 ExecutorService 硬凑
如果你有具体场景(比如:每天定时、任务失败重试、分布式定时),我可以给你更合适的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。