调度任务在延迟或重复之后的固定时间运行

ScheduledExecutorService 类提供了一种以多种方式调度单个或重复任务的方法。以下代码示例假定 pool 已声明并初始化如下:

ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);

除了普通的 ExecutorService 方法之外,ScheduledExecutorService API 还增加了 4 种方法来安排任务并返回 ScheduledFuture 对象。后者可用于检索结果(在某些情况下)和取消任务。

在固定延迟后启动任务

以下示例计划在十分钟后启动任务。

ScheduledFuture<Integer> future = pool.schedule(new Callable<>() {
        @Override public Integer call() {
            // do something
            return 42;
        }
    }, 
    10, TimeUnit.MINUTES);

以固定费率启动任务

以下示例将任务计划为在十分钟后开始,然后以每一分钟一次的速率重复。

ScheduledFuture<?> future = pool.scheduleAtFixedRate(new Runnable() {
        @Override public void run() {
            // do something
        }
    }, 
    10, 1, TimeUnit.MINUTES);

任务执行将根据计划继续,直到 pool 关闭,future 被取消,或者其中一个任务遇到异常。

保证给定 scheduledAtFixedRate 调用所安排的任务不会在时间上重叠。如果任务花费的时间超过规定的时间段,则下一个和后续的任务执行可能会延迟。

以固定延迟启动任务

以下示例将任务计划为在十分钟后启动,然后在一个任务结束和下一个任务结束之间重复延迟一分钟。

ScheduledFuture<?> future = pool.scheduleWithFixedDelay(new Runnable() {
        @Override public void run() {
            // do something
        }
    }, 
    10, 1, TimeUnit.MINUTES);

任务执行将根据计划继续,直到 pool 关闭,future 被取消,或者其中一个任务遇到异常。