public class HashedWheelTimer extends java.lang.Object implements Timer
Timer
optimized for approximated I/O timeout scheduling.
TimerTask
on time. HashedWheelTimer
, on every tick, will
check if there are any TimerTask
s behind the schedule and execute
them.
You can increase or decrease the accuracy of the execution timing by specifying smaller or larger tick duration in the constructor. In most network applications, I/O timeout does not need to be accurate. Therefore, the default tick duration is 100 milliseconds and you will not need to try different configurations in most cases.
HashedWheelTimer
maintains a data structure called 'wheel'.
To put simply, a wheel is a hash table of TimerTask
s whose hash
function is 'dead line of the task'. The default number of ticks per wheel
(i.e. the size of the wheel) is 512. You could specify a larger value
if you are going to schedule a lot of timeouts.
HashedWheelTimer
creates a new thread whenever it is instantiated and
started. Therefore, you should make sure to create only one instance and
share it across your application. One of the common mistakes, that makes
your application unresponsive, is to create a new instance for every connection.
HashedWheelTimer
is based on
George Varghese and
Tony Lauck's paper,
'Hashed
and Hierarchical Timing Wheels: data structures to efficiently implement a
timer facility'. More comprehensive slides are located
here.限定符和类型 | 字段和说明 |
---|---|
static int |
WORKER_STATE_INIT |
static int |
WORKER_STATE_SHUTDOWN |
static int |
WORKER_STATE_STARTED |
构造器和说明 |
---|
HashedWheelTimer()
Creates a new timer with the default thread factory
(
Executors.defaultThreadFactory() ), default tick duration, and
default number of ticks per wheel. |
HashedWheelTimer(long tickDuration,
java.util.concurrent.TimeUnit unit)
Creates a new timer with the default thread factory
(
Executors.defaultThreadFactory() ) and default number of ticks
per wheel. |
HashedWheelTimer(long tickDuration,
java.util.concurrent.TimeUnit unit,
int ticksPerWheel)
Creates a new timer with the default thread factory
(
Executors.defaultThreadFactory() ). |
HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory)
Creates a new timer with the default tick duration and default number of
ticks per wheel.
|
HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory,
long tickDuration,
java.util.concurrent.TimeUnit unit)
Creates a new timer with the default number of ticks per wheel.
|
HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory,
long tickDuration,
java.util.concurrent.TimeUnit unit,
int ticksPerWheel)
Creates a new timer.
|
HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory,
long tickDuration,
java.util.concurrent.TimeUnit unit,
int ticksPerWheel,
boolean leakDetection)
Creates a new timer.
|
HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory,
long tickDuration,
java.util.concurrent.TimeUnit unit,
int ticksPerWheel,
boolean leakDetection,
long maxPendingTimeouts)
Creates a new timer.
|
HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory,
long tickDuration,
java.util.concurrent.TimeUnit unit,
int ticksPerWheel,
boolean leakDetection,
long maxPendingTimeouts,
java.util.concurrent.Executor taskExecutor)
Creates a new timer.
|
限定符和类型 | 方法和说明 |
---|---|
protected void |
finalize() |
Timeout |
newTimeout(TimerTask task,
long delay,
java.util.concurrent.TimeUnit unit)
Schedules the specified
TimerTask for one-time execution after
the specified delay. |
long |
pendingTimeouts()
Returns the number of pending timeouts of this
Timer . |
void |
start()
Starts the background thread explicitly.
|
java.util.Set<Timeout> |
stop()
Releases all resources acquired by this
Timer and cancels all
tasks which were scheduled but not executed yet. |
public static final int WORKER_STATE_INIT
public static final int WORKER_STATE_STARTED
public static final int WORKER_STATE_SHUTDOWN
public HashedWheelTimer()
Executors.defaultThreadFactory()
), default tick duration, and
default number of ticks per wheel.public HashedWheelTimer(long tickDuration, java.util.concurrent.TimeUnit unit)
Executors.defaultThreadFactory()
) and default number of ticks
per wheel.tickDuration
- the duration between tickunit
- the time unit of the tickDuration
java.lang.NullPointerException
- if unit
is null
java.lang.IllegalArgumentException
- if tickDuration
is <= 0public HashedWheelTimer(long tickDuration, java.util.concurrent.TimeUnit unit, int ticksPerWheel)
Executors.defaultThreadFactory()
).tickDuration
- the duration between tickunit
- the time unit of the tickDuration
ticksPerWheel
- the size of the wheeljava.lang.NullPointerException
- if unit
is null
java.lang.IllegalArgumentException
- if either of tickDuration
and ticksPerWheel
is <= 0public HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory)
threadFactory
- a ThreadFactory
that creates a
background Thread
which is dedicated to
TimerTask
execution.java.lang.NullPointerException
- if threadFactory
is null
public HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory, long tickDuration, java.util.concurrent.TimeUnit unit)
threadFactory
- a ThreadFactory
that creates a
background Thread
which is dedicated to
TimerTask
execution.tickDuration
- the duration between tickunit
- the time unit of the tickDuration
java.lang.NullPointerException
- if either of threadFactory
and unit
is null
java.lang.IllegalArgumentException
- if tickDuration
is <= 0public HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory, long tickDuration, java.util.concurrent.TimeUnit unit, int ticksPerWheel)
threadFactory
- a ThreadFactory
that creates a
background Thread
which is dedicated to
TimerTask
execution.tickDuration
- the duration between tickunit
- the time unit of the tickDuration
ticksPerWheel
- the size of the wheeljava.lang.NullPointerException
- if either of threadFactory
and unit
is null
java.lang.IllegalArgumentException
- if either of tickDuration
and ticksPerWheel
is <= 0public HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory, long tickDuration, java.util.concurrent.TimeUnit unit, int ticksPerWheel, boolean leakDetection)
threadFactory
- a ThreadFactory
that creates a
background Thread
which is dedicated to
TimerTask
execution.tickDuration
- the duration between tickunit
- the time unit of the tickDuration
ticksPerWheel
- the size of the wheelleakDetection
- true
if leak detection should be enabled always,
if false it will only be enabled if the worker thread is not
a daemon thread.java.lang.NullPointerException
- if either of threadFactory
and unit
is null
java.lang.IllegalArgumentException
- if either of tickDuration
and ticksPerWheel
is <= 0public HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory, long tickDuration, java.util.concurrent.TimeUnit unit, int ticksPerWheel, boolean leakDetection, long maxPendingTimeouts)
threadFactory
- a ThreadFactory
that creates a
background Thread
which is dedicated to
TimerTask
execution.tickDuration
- the duration between tickunit
- the time unit of the tickDuration
ticksPerWheel
- the size of the wheelleakDetection
- true
if leak detection should be enabled always,
if false it will only be enabled if the worker thread is not
a daemon thread.maxPendingTimeouts
- The maximum number of pending timeouts after which call to
newTimeout
will result in
RejectedExecutionException
being thrown. No maximum pending timeouts limit is assumed if
this value is 0 or negative.java.lang.NullPointerException
- if either of threadFactory
and unit
is null
java.lang.IllegalArgumentException
- if either of tickDuration
and ticksPerWheel
is <= 0public HashedWheelTimer(java.util.concurrent.ThreadFactory threadFactory, long tickDuration, java.util.concurrent.TimeUnit unit, int ticksPerWheel, boolean leakDetection, long maxPendingTimeouts, java.util.concurrent.Executor taskExecutor)
threadFactory
- a ThreadFactory
that creates a
background Thread
which is dedicated to
TimerTask
execution.tickDuration
- the duration between tickunit
- the time unit of the tickDuration
ticksPerWheel
- the size of the wheelleakDetection
- true
if leak detection should be enabled always,
if false it will only be enabled if the worker thread is not
a daemon thread.maxPendingTimeouts
- The maximum number of pending timeouts after which call to
newTimeout
will result in
RejectedExecutionException
being thrown. No maximum pending timeouts limit is assumed if
this value is 0 or negative.taskExecutor
- The Executor
that is used to execute the submitted TimerTask
s.
The caller is responsible to shutdown the Executor
once it is not needed
anymore.java.lang.NullPointerException
- if either of threadFactory
and unit
is null
java.lang.IllegalArgumentException
- if either of tickDuration
and ticksPerWheel
is <= 0protected void finalize() throws java.lang.Throwable
finalize
在类中 java.lang.Object
java.lang.Throwable
public void start()
java.lang.IllegalStateException
- if this timer has been
stopped alreadypublic java.util.Set<Timeout> stop()
Timer
Timer
and cancels all
tasks which were scheduled but not executed yet.public Timeout newTimeout(TimerTask task, long delay, java.util.concurrent.TimeUnit unit)
Timer
TimerTask
for one-time execution after
the specified delay.newTimeout
在接口中 Timer
public long pendingTimeouts()
Timer
.