类 TaskKit
java.lang.Object
com.iohao.game.common.kit.concurrent.TaskKit
任务消费相关的内部工具类,开发者不要用在耗时 io 的任务上
example - 使用其他线程执行任务
TaskKit.execute(()->{
log.info("你的逻辑");
});
example - netty TimerTask
// 3 秒后执行
TaskKit.newTimeout(new TimerTask() {
@Override
public void run(Timeout timeout) {
log.info("3-newTimeout : {}", timeout);
}
}, 3, TimeUnit.SECONDS);
example - TaskListener 监听回调。内部使用 HashedWheelTimer 来模拟 ScheduledExecutorService 调度
// 只执行一次,2 秒后执行
TaskKit.runOnce(() -> log.info("2 Seconds"), 2, TimeUnit.SECONDS);
// 只执行一次,1 分钟后执行
TaskKit.runOnce(() -> log.info("1 Minute"), 1, TimeUnit.MINUTES)
// 只执行一次,500、800 milliseconds 后
TaskKit.runOnce(() -> log.info("500 delayMilliseconds"), 500);
TaskKit.runOnce(() -> log.info("800 delayMilliseconds"), 800);
// 每分钟调用一次
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);
example - TaskListener - 高级用法
//【示例 - 移除任务】每秒调用一次,当 hp 为 0 时就移除当前 Listener
TaskKit.runInterval(new IntervalTaskListener() {
int hp = 2;
@Override
public void onUpdate() {
hp--;
log.info("剩余 hp:2-{}", hp);
}
@Override
public boolean isActive() {
// 当返回 false 则表示不活跃,会从监听列表中移除当前 Listener
return hp != 0;
}
}, 1, TimeUnit.SECONDS);
//【示例 - 跳过执行】每秒调用一次,当 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);
//【示例 - 指定线程执行器】每秒调用一次
// 如果有耗时的任务,比如涉及一些 io 操作的,建议指定执行器来执行当前回调(onUpdate 方法),以避免阻塞其他任务。
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 TaskKit.getCacheExecutor();
}
}, 1, TimeUnit.SECONDS);
- 作者:
- 渔民小镇
- 日期:
- 2023-12-02
-
构造器概要
-
方法概要
修饰符和类型方法说明void
使用其他线程执行任务void
executeVirtual
(Runnable command) 使用虚拟线程执行任务io.netty.util.Timeout
newTimeout
(io.netty.util.TimerTask task, long delay, TimeUnit unit) 延迟一定时间后执行任务;void
runInterval
(IntervalTaskListener taskListener, long tick, TimeUnit timeUnit) 添加任务监听回调void
runIntervalMinute
(IntervalTaskListener taskListener, long tickMinute) 添加调度任务监听void
runOnce
(OnceTaskListener taskListener, long delay, TimeUnit unit) 添加 OnceTaskListener 监听回调,只会执行一次void
runOnceMillis
(OnceTaskListener taskListener, long delayMilliseconds) 添加 OnceTaskListener 监听回调,只会执行一次void
runOnceSecond
(OnceTaskListener taskListener) 一秒后执行 OnceTaskListener 监听回调,只会执行一次void
stop()
<U> CompletableFuture
<U> supplyAsync
(Supplier<U> supplier) 返回一个 CompletableFuture,该任务会在 virtualExecutor(虚拟线程) 中异步运行,结果将从 Supplier 中获得
-
构造器详细资料
-
TaskKit
public TaskKit()
-
-
方法详细资料
-
execute
使用其他线程执行任务- 参数:
command
- 任务
-
executeVirtual
使用虚拟线程执行任务- 参数:
command
- 任务
-
supplyAsync
返回一个 CompletableFuture,该任务会在 virtualExecutor(虚拟线程) 中异步运行,结果将从 Supplier 中获得- 类型参数:
U
- u- 参数:
supplier
- supplier- 返回:
- CompletableFuture
- 另请参阅:
-
newTimeout
延迟一定时间后执行任务;- 参数:
task
- 任务delay
- 延迟时间unit
- 延迟时间单位- 返回:
- Timeout
-
runOnce
添加 OnceTaskListener 监听回调,只会执行一次- 参数:
taskListener
- taskListenerdelay
- 延迟时间unit
- 延迟时间单位
-
runOnceSecond
一秒后执行 OnceTaskListener 监听回调,只会执行一次- 参数:
taskListener
- taskListener
-
runOnceMillis
添加 OnceTaskListener 监听回调,只会执行一次- 参数:
taskListener
- taskListenerdelayMilliseconds
- delayMilliseconds
-
runIntervalMinute
添加调度任务监听- 参数:
taskListener
- 调度任务监听tickMinute
- 每 tickMinute 分钟,会调用一次监听
-
runInterval
添加任务监听回调每 tick 时间单位,会调用一次任务监听
- 参数:
taskListener
- 任务监听tick
- tick 时间间隔;每 tick 时间间隔,会调用一次监听timeUnit
- tick 时间单位
-
stop
public void stop()
-