如何中断 ScheduledExecutorService

How to interrupt a ScheduledExecutorService

我有一个 ScheduledExecutorService,我正在使用它 运行 一种方法 updateIndex() 每隔一分钟。但是,如果在上次刷新和下一次刷新之间的一分钟内对资源进行了更改,我希望立即调用 updateIndex(),然后让执行程序服务恢复其正常计划;即下一次更新将在一分钟后进行。但是,我没有在文档中看到任何暗示有能力执行此操作的内容。有什么想法吗?

public static void updateIndex() {
        Runnable runnable = () -> {
            //Do your logic here
        };
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.MINUTES);
        }

根据 JavaDocs

java.util.concurrent.ScheduledExecutorService.scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

创建并执行一个周期性动作,该动作在给定的初始延迟后首先启用,然后在给定的周期内启用;也就是说,执行将在 initialDelay 之后开始,然后是 initialDelay+period,然后是 initialDelay + 2 * period,依此类推。如果任务的任何执行遇到异常,则后续执行将被抑制。否则,任务只会通过取消或终止执行者来终止。如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会并发执行。

scheduleAtFixedRate() returns 一个 ScheduledFuture which is a Future 有你正在寻找的 cancel 方法。