调度、定时器相关便捷工具
iohao opened this issue · comments
渔民小镇 commented
新增功能的使用场景
计划增加调度、定时器相关便捷工具。使用 HashedWheelTimer 来模拟 ScheduledExecutorService 调度
// 每分钟调用一次
TaskKit.runIntervalMinute(() -> log.info("tick 1 Minute"), 1);
// 每 2 分钟调用一次
TaskKit.runIntervalMinute(() -> log.info("tick 2 Minute"), 2);
// 每 2 秒调用一次
TaskKit.runInterval(() -> log.info("tick 2 Seconds"), 2, TimeUnit.SECONDS);
// 每 30 分钟调用一次
TaskKit.runInterval(() -> log.info("tick 30 Minute"), 30, TimeUnit.MINUTES);
任务需要具备取消、跳过执行等扩展。
渔民小镇 commented
【示例 - 移除任务】每秒调用一次,当 hp 为 0 时就移除当前 TimerListener
TaskKit.runInterval(new IntervalTaskListener() {
int hp = 2;
@Override
public void onUpdate() {
hp--;
log.info("剩余 hp:2-{}", hp);
}
@Override
public boolean isActive() {
// 当返回 false 则表示不活跃,会从监听列表中移除当前 TimerListener
return hp != 0;
}
}, 1, TimeUnit.SECONDS);
渔民小镇 commented
【示例 - 跳过执行】每秒调用一次,当 triggerUpdate 返回值为 true,即符合条件时才执行 onUpdate 方法
TaskKit.runInterval(new IntervalTaskListener() {
int hp;
@Override
public void onUpdate() {
log.info("current hp:{}", hp);
}
@Override
public boolean triggerUpdate() {
hp++;
// 当返回值为 true 时,会执行 onUpdate 方法
return hp % 2 == 0;
}
}, 1, TimeUnit.SECONDS);
渔民小镇 commented
【示例 - 指定线程执行器】每秒调用一次
如果有耗时的任务,比如涉及一些 io 操作的,建议指定执行器来执行当前回调(onUpdate 方法),以避免阻塞其他任务。
ExecutorService executorService = Executors.newCachedThreadPool();
TaskKit.runInterval(new IntervalTaskListener() {
@Override
public void onUpdate() {
log.info("执行耗时的 IO 任务,开始");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("执行耗时的 IO 任务,结束");
}
@Override
public Executor getExecutor() {
// 指定执行器来执行当前回调(onUpdate 方法),以避免阻塞其他任务。
return executorService;
}
}, 1, TimeUnit.SECONDS);
渔民小镇 commented
17.1.60