十五、时间轮定时器
15. 时间轮定时器
时间轮定时器是一个在对时间要求不那么严格且对定时精度没有严格要求的情况下使用的定时器,他能够在占用一定数量的内存为代价的情况下极大的减少 JVM 中因定时任务带来的线程消耗。
15.1 类说明
定时器类: org.voovan.tools.hashwheeltimer.HashWheelTimer
定时任务类: HashWheelTask
15.2定时器类方法说明
15.2.1 构造函数
public HashWheelTimer(int size)
- 构造函数,默认每槽的步长是1ms
size
: 时间轮的槽数。
15.2.2 构造函数
public HashWheelTimer(int size, int tickStep)
- 构造函数,默认每槽的步长是1s
size
: 时间轮的槽数。tickStep
: 每槽的步长。
15.2.3 增加任务
public boolean addTask(HashWheelTask task, int interval)
- 同步方式执行
task
: 任务对象。interval
: 任务间隔的槽数。返回值
: true 增加任务成功, false: 增加任务失败, 任务的Interval必须大于0
15.2.4 增加任务
public boolean addTask(HashWheelTask task, int interval, boolean asynchronous)
task
: 任务对象。interval
: 任务间隔的槽数。asynchronous
: 是否异步执行。返回值
: true 增加任务成功, false: 增加任务失败, 任务的Interval必须大于0
15.2.5 移除任务
public boolean removeTask(HashWheelTask task)
task
: 任务对象。返回值
: true:移除任务成功, false:移除任务失败,或任务不存在
15.2.6 启动时间轮的轮转
public boolean rotate()
返回值
: true:成功启动, false:时间轮已经启动
15.3定时器任务类方法说明
15.3.1 构造函数
public HashWheelTask()
- 构造函数
15.3.2 构造函数
public HashWheelTask(int interval, boolean asynchronous)
- 构造函数,默认每槽的步长是1s
interval
: 任务的槽间隔数。asynchronous
: 是否异步执行。
15.3.3 跳跃属性
public int getSkipTick()
public void setSkipTick(int skipTick)
- 设置/获取跳跃的轮次数
skipTick
: 跳跃的轮次数。
15.3.4 任务的槽间隔属性
public int getInterval()
public void setInterval(int interval)
- 设置/获取任务的槽间隔
interval
: 当前任务槽间隔。
15.3.5 异步任务属性
public boolean isAsynchronous()
public void setAsynchronous(boolean asynchronous)
- 设置/获取异步任务属性
asynchronous
: true: 异步任务, false: 同步任务。
15.3.6 获取当前任务的槽位
public int getSlot()
返回值
: 当前任务的槽位。
15.3.7 取消当前任务
public boolean cancel()
返回值
: true: 成功, false:失败
15.3.8 取消当前任务
public abstract void run()
- 抽象方法用于实现任务逻辑
15.3.9 执行一次当前任务
public boolean doTask()
- 步进一次,并执行一次当前任务, 此方法的存在主要是方便进行单元测试
返回值
: true: 执行了这个任务, false: 未执行这个任务
15.4 使用举例
类:org.voovan.test.tools.hashwheeltimer.HashWheelTimerUnit
public class HashWheelTimerUnit extends TestCase {
private HashWheelTimer hashWheelTimer;
public void setUp() throws IOException {
//5个槽位,每个槽位1秒
hashWheelTimer = new HashWheelTimer(5, 1);
//1个步长
hashWheelTimer.addTask(new HashWheelTask() {
@Override
public void run() {
Logger.simple("\t 1: Sync: "+Thread.currentThread().getName()+" "+TDateTime.format(new Date(), TDateTime.STANDER_DATETIME_TEMPLATE));
}
}, 1);
//两个步长
hashWheelTimer.addTask(new HashWheelTask() {
@Override
public void run() {
Logger.simple("\t 2: Sync: "+Thread.currentThread().getName()+" "+TDateTime.format(new Date(), TDateTime.STANDER_DATETIME_TEMPLATE));
}
}, 2);
//5个步长
hashWheelTimer.addTask(new HashWheelTask() {
@Override
public void run() {
Logger.simple("\t 5: Sync: "+Thread.currentThread().getName()+" "+TDateTime.format(new Date(), TDateTime.STANDER_DATETIME_TEMPLATE));
}
}, 5);
//6个步长
hashWheelTimer.addTask(new HashWheelTask() {
@Override
public void run() {
Logger.simple("\t 6: Async: "+Thread.currentThread().getName()+" "+TDateTime.format(new Date(), TDateTime.STANDER_DATETIME_TEMPLATE));
}
}, 6, true);
//12个步长
hashWheelTimer.addTask(new HashWheelTask() {
@Override
public void run() {
Logger.simple("\t12: Sync: "+Thread.currentThread().getName()+" "+TDateTime.format(new Date(), TDateTime.STANDER_DATETIME_TEMPLATE));
}
}, 12);
}
public void testRotateWheel(){
hashWheelTimer.rotate();
TEnv.sleep(60 * 1000 * 10);
}
}