类 TaskKit

java.lang.Object
com.iohao.game.common.kit.concurrent.TaskKit

public class TaskKit extends Object
任务消费相关的内部工具类,开发者不要用在耗时 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
  • 构造器详细资料

    • TaskKit

      public TaskKit()
  • 方法详细资料

    • execute

      public void execute(Runnable command)
      使用其他线程执行任务
      参数:
      command - 任务
    • executeVirtual

      public void executeVirtual(Runnable command)
      使用虚拟线程执行任务
      参数:
      command - 任务
    • supplyAsync

      public <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
      返回一个 CompletableFuture,该任务会在 virtualExecutor(虚拟线程) 中异步运行,结果将从 Supplier 中获得
      类型参数:
      U - u
      参数:
      supplier - supplier
      返回:
      CompletableFuture
      另请参阅:
      • virtualExecutor
    • newTimeout

      public io.netty.util.Timeout newTimeout(io.netty.util.TimerTask task, long delay, TimeUnit unit)
      延迟一定时间后执行任务;
      参数:
      task - 任务
      delay - 延迟时间
      unit - 延迟时间单位
      返回:
      Timeout
    • runOnce

      public void runOnce(OnceTaskListener taskListener, long delay, TimeUnit unit)
      添加 OnceTaskListener 监听回调,只会执行一次
      参数:
      taskListener - taskListener
      delay - 延迟时间
      unit - 延迟时间单位
    • runOnceSecond

      public void runOnceSecond(OnceTaskListener taskListener)
      一秒后执行 OnceTaskListener 监听回调,只会执行一次
      参数:
      taskListener - taskListener
    • runOnceMillis

      public void runOnceMillis(OnceTaskListener taskListener, long delayMilliseconds)
      添加 OnceTaskListener 监听回调,只会执行一次
      参数:
      taskListener - taskListener
      delayMilliseconds - delayMilliseconds
    • runIntervalMinute

      public void runIntervalMinute(IntervalTaskListener taskListener, long tickMinute)
      添加调度任务监听
      参数:
      taskListener - 调度任务监听
      tickMinute - 每 tickMinute 分钟,会调用一次监听
    • runInterval

      public void runInterval(IntervalTaskListener taskListener, long tick, TimeUnit timeUnit)
      添加任务监听回调
           每 tick 时间单位,会调用一次任务监听
       
      参数:
      taskListener - 任务监听
      tick - tick 时间间隔;每 tick 时间间隔,会调用一次监听
      timeUnit - tick 时间单位
    • stop

      public void stop()