hutool 定时任务 TimedCache – GlobalPruneTimer

今天看hutool工具中的TimedCache 时好奇他的缓存机制及定时清除原理 便简单的看了一下他的源码,总结出是  

Map(缓存数据)+ScheduledExecutorService(定时清除缓存),其中的定时任务感觉比较有意思,则拷贝出来
public enum GlobalPruneTimer {
    /**
     * 单例对象
     */
    INSTANCE;

    /**
     * 缓存任务计数
     */
    private final AtomicInteger cacheTaskNumber = new AtomicInteger(1);

    /**
     * 定时器
     */
    private ScheduledExecutorService pruneTimer;

    /**
     * 构造
     */
    GlobalPruneTimer() {
        create();
    }

    /**
     * 启动定时任务
     *
     * @param task  任务
     * @param delay 周期
     * @param unit
     * @return {@link ScheduledFuture}对象,可手动取消此任务
     */
    public ScheduledFuture<?> schedule(Runnable task, int delay, TimeUnit unit) {
        return this.pruneTimer.scheduleAtFixedRate(task, delay, delay, unit);
    }

    /**
     * 创建定时器
     */
    public void create() {
        if (null != pruneTimer) {
            shutdownNow();
        }
        this.pruneTimer = new ScheduledThreadPoolExecutor(1, r -> ThreadUtil.newThread(r, StrUtil.format("Pure-Timer-{}", cacheTaskNumber.getAndIncrement())));
    }

    /**
     * 销毁全局定时器
     */
    public void shutdown() {
        if (null != pruneTimer) {
            pruneTimer.shutdown();
        }
    }

    /**
     * 销毁全局定时器
     *
     * @return 销毁时未被执行的任务列表
     */
    public List<Runnable> shutdownNow() {
        if (null != pruneTimer) {
            return pruneTimer.shutdownNow();
        }
        return null;
    }
}

使用例子:

public class ScheduleTest {
    public static void main(String[] args) {
        ScheduleTest test = new ScheduleTest();
        GlobalPruneTimer.INSTANCE.schedule(test::schedule,5, SECONDS);
    }
    @SneakyThrows
    public void schedule(){
        System.out.println("Start: " + DateUtil.now());
        SECONDS.sleep(3);
        System.out.println("End  : " + DateUtil.now());
    }
}

 

hutool 定时任务 TimedCache - GlobalPruneTimer

[db:回答]

以上是hutool 定时任务 TimedCache – GlobalPruneTimer的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>