• 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());
        }
    }
  • 相关阅读:
    谈谈jQuery之绑定事件
    手机移动端WEB资源整合
    2016移动端web5分钟速成(适合新手)
    日常整理的一些网址
    web服务器页面错误代码集
    jQuery事件绑定的最佳实践
    前端体系
    js刷新页面的几种方法
    JAVA的静态变量、静态方法、静态类
    在Hadoop集群中添加机器和删除机器
  • 原文地址:https://www.cnblogs.com/zcjyzh/p/15074951.html
Copyright © 2020-2023  润新知