iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;

Home Page:http://game.iohao.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

调度、定时器相关便捷工具

iohao opened this issue · comments

新增功能的使用场景

计划增加调度、定时器相关便捷工具。使用 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);

任务需要具备取消、跳过执行等扩展。

【示例 - 移除任务】每秒调用一次,当 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);

【示例 - 跳过执行】每秒调用一次,当 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 方法),以避免阻塞其他任务。

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);

17.1.60