java - ExecutorService如何改变调度时钟

标签 java multithreading executorservice scheduledexecutorservice system-clock

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

我的问题是,必须有一个系统时钟在设备 hibernate 的情况下继续运行,我怎样才能让 executor scheduler使用那个时钟而不是它现在使用的那个尊重设备进入深度 sleep 并暂停滴答作响的时钟?

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

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

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

最佳答案

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

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

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

关于java - ExecutorService如何改变调度时钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35673177/

相关文章:

java - 如何使 ExecutorService 中的线程与 Runnable 进行通信?

java - 如何使用配置文件运行 gradle?重复 key : spring

java - 收集器.toMap IllegalStateException : Duplicate key when no duplication is possible

java - Clojure 真正与与并发/不变性功能无关的 Java 相比有什么例子吗?

python - 具有 'internal'/'external' 守护线程的应用程序之间的功能差异

java - Java中如何创建这三个线程

java - 实现魔法

c++ - 是否可以编写可以在 HPX 和 C++1x 线程之间切换的代码?

java - 如何证明java中的HashMap不是线程安全的

java - 如何使用 ExecutorService Java 减少到达 Runnable 类的运行方法的时间延迟