public ScheduledFuture<?> scheduleAtFixedRate(AbstractManagedExecutorService executor, Runnable command, long initialDelay, long period, TimeUnit unit) { if (command == null || unit == null) throw new NullPointerException(); if (period <= 0) throw new IllegalArgumentException(); ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<Void> t = new ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<>( executor, command, null, triggerTime(initialDelay, unit), unit.toNanos(period)); delayedExecute(t); return t; }
@Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask task = (ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask) r; try { task.done(t /*task.getTaskRunException()*/); } finally { task.resetContext(); // Kill thread if thread older than threadLifeTime if (threadLifeTime > 0) { Thread thread = Thread.currentThread(); if (thread instanceof AbstractManagedThread) { long threadStartTime = ((AbstractManagedThread)thread).getThreadStartTime(); if ((System.currentTimeMillis() - threadStartTime)/1000 > threadLifeTime) { throw new ThreadExpiredException(); } } } } }
@Override public void run() { if (controller.skipRun(new Date(scheduledRunTime))) { return; } long lastRunStartTime = System.currentTimeMillis(); Object lastResult = null; try { super.run(); lastResult = get(); } catch (Throwable t) { } long lastRunEndTime = System.currentTimeMillis(); controller.doneExecution(lastResult, scheduledRunTime, lastRunStartTime, lastRunEndTime); }
/** * Main execution method for delayed or periodic tasks. If pool * is shut down, rejects the task. Otherwise adds task to queue * and starts a thread, if necessary, to run it. (We cannot * prestart the thread to run the task because the task (probably) * shouldn't be run yet,) If the pool is shut down while the task * is being added, cancel and remove it if required by state and * run-after-shutdown parameters. * * @param task the task */ private void delayedExecute(ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<?> task) { task.submitted(); if (isShutdown()) reject(task); else { super.getQueue().add(task); if (isShutdown() && !canRunInCurrentRunState(task.isPeriodic()) && remove(task)) task.cancel(false); else ensurePrestart(); } }
@Override public int compareTo(Delayed other) { if (other == this) { return 0; } if (other instanceof ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask) { ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<?> x = (ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<?>)other; long diff = nextRunTime - x.nextRunTime; if (diff < 0) return -1; else if (diff > 0) return 1; else if (sequenceNumber < x.sequenceNumber) return -1; else return 1; } long d = (getDelay(TimeUnit.NANOSECONDS) - other.getDelay(TimeUnit.NANOSECONDS)); return (d == 0) ? 0 : ((d < 0) ? -1 : 1); }
public ScheduledFuture<?> scheduleWithFixedDelay(AbstractManagedExecutorService executor, Runnable command, long initialDelay, long delay, TimeUnit unit) { if (command == null || unit == null) throw new NullPointerException(); if (delay <= 0) throw new IllegalArgumentException(); ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<Void> t = new ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<>( executor, command, null, triggerTime(initialDelay, unit), unit.toNanos(-delay)); delayedExecute(t); return t; }
public <V> ScheduledFuture<V> schedule(AbstractManagedExecutorService executor, Runnable command, V result, long delay, TimeUnit unit) { if (command == null || unit == null) { throw new NullPointerException(); } ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<V> t = new ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<>( executor, command, result, triggerTime(delay, unit)); delayedExecute(t); return t; }
/** * Overrides FutureTask version so as to reset/requeue if periodic. */ @Override public void run() { boolean periodic = isPeriodic(); if (!canRunInCurrentRunState(periodic)) { cancel(false); } else if (!periodic) { ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask.super.run(); } else if (ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask.super.runAndReset()) { setNextRunTime(); reExecutePeriodic(outerTask); } } }
public <V> ScheduledFuture<V> schedule(AbstractManagedExecutorService executor, Callable<V> callable, long delay, TimeUnit unit) { if (callable == null || unit == null) throw new NullPointerException(); ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<V> t = new ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask<>( executor, callable, triggerTime(delay, unit)); delayedExecute(t); return t; }
public ManagedFutureTask newTaskFor( AbstractManagedExecutorService executor, Callable callable) { return new ManagedScheduledFutureTask(executor, callable, 0L); }
public <V> ManagedFutureTask<V> newTaskFor( AbstractManagedExecutorService executor, Runnable r, V result) { return new ManagedScheduledFutureTask<>(executor, r, result, 0L); }
@Override public boolean equals(Object other) { if (other instanceof ManagedScheduledThreadPoolExecutor.ManagedScheduledFutureTask) { return compareTo((ManagedScheduledFutureTask)other) == 0; } return false; }