温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何用ExecutorService做定时任务

发布时间:2026-10-06 18:54:06 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 Java 中,ExecutorService 本身并不是专门用来做定时任务的,它主要用于线程池管理。如果你要做定时 / 周期性任务,通常有两种方式:


一、正确做法:使用 ScheduledExecutorService

ScheduledExecutorService 是 ExecutorService 的子接口,专门用来做定时任务。

1️⃣ 单次延迟任务

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();
    }
}

2️⃣ 固定频率执行(可能重叠)

executor.scheduleAtFixedRate(
        () -> System.out.println("执行任务"),
        1, // 初始延迟
        3, // 每隔3秒
        TimeUnit.SECONDS
);

⚠️ 如果任务执行时间 > 周期,会立即开始下一次


3️⃣ 固定延迟执行(不重叠)

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("每秒执行");
    }
});

❌ 缺点:

  • 不好控制
  • 不易优雅关闭
  • 容易写出“假定时”

三、ExecutorService vs Timer

对比项 ScheduledExecutorService Timer
多线程 ✅ ❌
异常容错 ✅ ❌
推荐程度 ⭐⭐⭐⭐⭐ ⭐

四、Spring 项目中的替代方案(补充)

如果是 Spring 项目,更推荐:

@Scheduled(fixedRate = 3000)
public void task() {}

总结

✅ 定时任务请用 ScheduledExecutorService
❌ 不要用普通 ExecutorService 硬凑

如果你有具体场景(比如:每天定时、任务失败重试、分布式定时),我可以给你更合适的方案。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手