Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ExecutorService how to change scheduling clock

I am using Java executorservice to create a timeout effect in one of my apps. After an elapsed time, they executor service begins and logs the user out of their session. But on an Android device when the device goes to sleep the executor thread is suspended. After the device awakes the thread is unsuspended. I would like the change the clock the executor is using so that it continues counting even after the device goes to deep sleep. Is there no way I can over ride which clock is being used (I realize I can swap out the entire implementation and use alarmmanager but I'm looking to not alter existing code at this point so please do not try to offer other APIs).

My question is, there must be a system clock that keeps going despite the device being asleep, how can I let the executor scheduler use that clock instead of the one it's using now which respects the device going to deep sleep and pauses ticking?

My code I have currently is very simple and just looks like this:

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

this code above starts the EndUserSession() in 6 minutes. It works but I want to use another clock that does not respect time out of mobile device.

like image 716
j2emanue Avatar asked Mar 03 '26 13:03

j2emanue


1 Answers

I have strong doubts that it's possible to influence scheduler service timing mechanisms.

You have another option to avoid problems caused by device sleep, like passing specific timestamp in constructor and scheduling a task at fixed rate. Example:

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);
like image 113
AdamSkywalker Avatar answered Mar 06 '26 03:03

AdamSkywalker



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!