ExecutorService如何改变调度时钟

ExecutorService how to change scheduling clock

我正在使用 Java executorservice 在我的一个应用程序中创建超时效果。经过一段时间后,他们的执行者服务开始并将用户从他们的会话中注销。但是在 Android 设备上,当设备进入睡眠状态时,执行程序线程将被挂起。设备唤醒后,线程将被取消挂起。我想更改执行者正在使用的时钟,以便即使在设备进入深度睡眠后它也会继续计数。有没有办法我可以超越正在使用的时钟(我意识到我可以换出整个实现并使用 alarmmanager 但我希望此时不改变现有代码所以请不要尝试提供其他 API)。

我的问题是,尽管设备处于睡眠状态,但必须有一个系统时钟继续运行,我怎样才能让 executor scheduler 使用该时钟而不是它现在使用的时钟,它尊重设备将要深度睡眠并暂停滴答作响?

我目前的代码非常简单,看起来像这样:

myExecutorService.schedule(new EndUserSession(),
                        6L, TimeUnit.MINUTES);

上述代码在 6 分钟内启动了 EndUserSession()。它可以工作,但我想使用另一个不考虑移动设备超时的时钟。

我非常怀疑是否有可能影响调度程序服务计时机制。

您还有另一种选择来避免设备休眠引起的问题,例如在构造函数中传递特定时间戳并以固定速率安排任务。示例:

class EndSessionTask {

    final long sessionExpirationTime;
    volatile ScheduledFuture future;

    public EndSessionTask(long ts) { sessionExpirationTime = ts; }

    public void run() {
        if (sessionExpirationTime < currentTs) return;
        endSession();
        future.cancel();
    }

    public void setFuture(ScheduledFuture f) { this.future = f; }
}

long endSessionTime = System.currentTimeMillis() + 6 * 60 * 1000;
EndSessionTask task = new EndSessionTask(endSessionTime);
ScheduledFuture future = executorService.scheduleAtFixedRate(task, 10L, 10L, SECONDS);
task.setFuture(future);