Class CyclicTimeout
- All Implemented Interfaces:
 Destroyable
An abstract implementation of a timeout.
Subclasses should implement onTimeoutExpired().
This implementation is optimised assuming that the timeout will mostly be cancelled and then reused with a similar value.
The typical scenario to use this class is when you have events that postpone (by re-scheduling), or cancel then re-schedule, a timeout for a single entity. For example: connection idleness, where for each connection there is a CyclicTimeout and a read/write postpones the timeout; when the timeout expires, the implementation checks against a timestamp if the connection is really idle. Another example: HTTP session expiration, where for each HTTP session there is a CyclicTimeout and at the beginning of the request processing the timeout is canceled (via cancel()), but at the end of the request processing the timeout is re-scheduled.
This implementation has a CyclicTimeout.Timeout holding the time
at which the scheduled task should fire, and a linked list of
CyclicTimeout.Wakeup, each holding the actual scheduled task.
Calling schedule(long, TimeUnit) the first time will
create a Timeout with an associated Wakeup and submit a task to
the scheduler.
Calling schedule(long, TimeUnit) again with the same or
a larger delay will cancel the previous Timeout, but keep the
previous Wakeup without submitting a new task to the scheduler,
therefore reducing the pressure on the scheduler and avoid it
becomes a bottleneck.
When the Wakeup task fires, it will see that the Timeout is now
in the future and will attach a new Wakeup with the future time
to the Timeout, and submit a scheduler task for the new Wakeup.
- See Also:
 
- 
Constructor Summary
Constructors - 
Method Summary
 
- 
Constructor Details
- 
CyclicTimeout
- Parameters:
 scheduler- A scheduler used to schedule wakeups
 
 - 
 - 
Method Details
- 
getScheduler
 - 
schedule
Schedules a timeout, even if already set, cancelled or expired.
If a timeout is already set, it will be cancelled and replaced by the new one.
- Parameters:
 delay- The period of time before the timeout expires.units- The unit of time of the period.- Returns:
 - true if the timeout was already set.
 
 - 
cancel
public boolean cancel()Cancels this CyclicTimeout so that it won't expire.
After being cancelled, this CyclicTimeout can be scheduled again.
- Returns:
 - true if this CyclicTimeout was scheduled to expire
 - See Also:
 
 - 
onTimeoutExpired
public abstract void onTimeoutExpired()Invoked when the timeout expires.
 - 
destroy
public void destroy()Destroys this CyclicTimeout.
After being destroyed, this CyclicTimeout is not used anymore.
- Specified by:
 destroyin interfaceDestroyable
 
 -