TimerTask.java |
/* * JBoss, the OpenSource J2EE webOS * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.util; /** * A class that represent a task that can be scheduled for one-shot or * repeated execution by a {@link TimerQueue}. <p> * A similar class is present in java.util package of jdk version >= 1.3; * for compatibility with jdk 1.2 we reimplemented it. * * @see TimerQueue * * @author <a href="mailto:simone.bordet@compaq.com">Simone Bordet</a> * @version $Revision: 1.2 $ */ public abstract class TimerTask implements Executable, Comparable { /** The state before the first execution */ static final int NEW = 1; /** The state after first execution if the TimerTask is repeating */ static final int SCHEDULED = 2; /** The state after first execution if the TimerTask is not repeating */ static final int EXECUTED = 3; /** The state when cancelled */ static final int CANCELLED = 4; // Attributes ---------------------------------------------------- private final Object m_lock = new Object(); private int m_state; // this is a constant, and need not be locked private final long m_period; private long m_nextExecutionTime; /** * Creates a TimerTask object that will be executed once. */ protected TimerTask() { m_state = NEW; m_period = 0; } /** * Creates a TimerTask object that will be executed every <code>period</code> * milliseconds. <p> * @param period the execution period; if zero, will be executed only once. */ protected TimerTask(long period) { m_state = NEW; if (period < 0) throw new IllegalArgumentException("Period can't be negative"); m_period = period; } /** * Cancels the next execution of this TimerTask (if any). <br> * If the TimerTask is executing it will prevent the next execution (if any). * @returns true if one or more scheduled execution will not take place, * false otherwise. */ public boolean cancel() { synchronized (getLock()) { boolean ret = (m_state == SCHEDULED); m_state = CANCELLED; return ret; } } // Executable implementation --------------------------------------- /** * The task to be executed, to be implemented in subclasses. */ public abstract void execute() throws Exception; // Comparable implementation --------------------------------------- /** * A TimerTask is less than another if it will be scheduled before. * @throws ClassCastException if other is not a TimerTask, according to the Comparable contract */ public int compareTo(Object other) { if (other == this) return 0; TimerTask t = (TimerTask) other; long diff = getNextExecutionTime() - t.getNextExecutionTime(); return (int) diff; } /** Returns the mutex that syncs the access to this object */ Object getLock() { return m_lock; } /** Sets the state of execution of this TimerTask */ void setState(int state) { synchronized (getLock()) { m_state = state; } } /** Returns the state of execution of this TimerTask */ int getState() { synchronized (getLock()) { return m_state; } } /** Returns whether this TimerTask is periodic */ boolean isPeriodic() { return m_period > 0; } /** Returns the next execution time for this TimerTask */ long getNextExecutionTime() { synchronized (getLock()) { return m_nextExecutionTime; } } /** Sets the next execution time for this TimerTask */ void setNextExecutionTime(long time) { synchronized (getLock()) { m_nextExecutionTime = time; } } /** Returns the period of this TimerTask */ protected long getPeriod() { return m_period; } }
TimerTask.java |