zoukankan      html  css  js  c++  java
  • hutool 定时任务 TimedCache

    今天看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());
        }
    }
  • 相关阅读:
    JS定时循环
    JS分组
    中位数 题解
    NOIP2017 D2T3 题解
    CF949E Binary Cards 题解
    友善的树形DP
    300英雄的危机(heroes)
    [北京省选集训2019]图的难题 题解
    洛谷 P1268 树的重量 题解
    洛谷 P2633 Count on a tree 题解
  • 原文地址:https://www.cnblogs.com/zcjyzh/p/15074951.html
Copyright © 2011-2022 走看看