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
-
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:
destroy
in interfaceDestroyable
-