Java ExecutorService如何更改调度时钟

Java ExecutorService如何更改调度时钟,java,multithreading,executorservice,scheduledexecutorservice,system-clock,Java,Multithreading,Executorservice,Scheduledexecutorservice,System Clock,我正在使用Java executorservice在我的一个应用程序中创建超时效果。经过一段时间后,执行器服务开始并将用户注销其会话。但是在安卓设备上,当设备进入睡眠状态时,执行器线程被挂起。设备唤醒后,线程将解除挂起。我想更改执行器正在使用的时钟,以便即使在设备进入深度睡眠后,它仍能继续计数。我没有办法克服使用的时钟(我意识到我可以交换整个实现并使用alarmmanager,但我希望此时不改变现有代码,所以请不要尝试提供其他API) 我的问题是,尽管设备处于睡眠状态,但必须有一个持续运行的系统

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

我的问题是,尽管设备处于睡眠状态,但必须有一个持续运行的系统时钟,我如何让设备使用该时钟,而不是它现在使用的时钟,从而使设备进入深度睡眠并暂停滴答声

我目前的代码非常简单,如下所示:

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);
类EndSessionTask{
最后一次长时间的会话模拟时间;
不稳定的计划未来;
公共EndSessionTask(长ts){sessionExpirationTime=ts;}
公开募捐{
if(sessionExpirationTime
您能解释一下10L逻辑吗。如果不清楚这有什么帮助。设备可以进入睡眠状态,您的日程安排将冻结。当它醒来时,如果它离开了,它还会继续off@j2emanue这个想法是每10秒检查一次会话是否过期。如果设备休眠一小时,任务将在唤醒后10秒内触发。它会注意到过期时间已经过去,并终止会话。然后它将取消计划的任务。