package com.limegroup.gnutella.util; import java.util.Timer; import java.util.TimerTask; import com.limegroup.gnutella.ErrorService; /** * An extension for Timer, allowing users to schedule Runnables instead * of TimerTasks. * * This does not expose the methods for scheduling at fixed rates. */ public class SimpleTimer { /** * The underlying Timer of this SimpleTimer. */ private final Timer TIMER; /** * Whether or not we actively cancelled the timer. */ private volatile boolean cancelled = false; /** * Creates a new active SimpleTimer with a callback for internal errors. * @param isDaemon true if this' thread should be a daemon. */ public SimpleTimer(boolean isDaemon) { TIMER = new Timer(isDaemon); } /** * Schedules the given task for fixed-delay execution after the * given delay, repeating every period. * * @param task the task to run repeatedly * @param delay the initial delay, in milliseconds * @param period the delay between executions, in milliseconds * or zero if it should not be rescheduled * @exception IllegalStateException this is cancelled * @exception IllegalArgumentException delay or period negative * @see java.util.Timer#schedule(java.util.TimerTask,long,long) */ public void schedule(final Runnable task, long delay, long period) throws IllegalStateException { if (delay < 0) throw new IllegalArgumentException("Negative delay: " + delay); if (period < 0) throw new IllegalArgumentException("Negative period: " + period); TimerTask tt = new TimerTask() { public void run() { try { task.run(); } catch(Throwable t) { ErrorService.error(t); } } }; try { if (period == 0) TIMER.schedule(tt, delay); else TIMER.schedule(tt, delay, period); } catch (IllegalStateException ise) { // swallow ISE's if the Timer cancelled itself. if (cancelled) throw ise; } } /** * Cancels this. No more tasks can be scheduled or executed. */ public void cancel() { cancelled = true; TIMER.cancel(); } }