美文网首页
ScheduledThreadPool 定时、延时任务--线程池

ScheduledThreadPool 定时、延时任务--线程池

作者: 颤抖的闪电 | 来源:发表于2017-09-28 09:25 被阅读0次

    前言:前面写了几个线程池的工具类,突然要用到延时任务,居然发现没有,现场撸了一个,如下。
    补:已经将前面的ScheduleUtil的定时功能结合进来了!!!有小修改,但是用依然!!!

    创建一个固定长度的线程池,而且以延迟或定时的方式来执行任务。
    ScheduledThreadPool:核心线程池固定,大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

    /**
     * @desc
     * @auth 方毅超
     * @time 2017/9/27 19:46
     */
    
    public class ScheduledThreadPool {
        private static ScheduledExecutorService pool = null;
    
        /*初始化线程池*/
        public static void init() {
            if (pool == null) {
                pool = Executors.newScheduledThreadPool(3);
            }
        }
    
        /*提交任务执行*/
        public static void execute(Runnable r) {
            init();
            pool.execute(r);
        }
    
        /*提交延迟任务执行,1000毫秒*/
        public static void executeDelay(Runnable r, long delay) {
            init();
            pool.schedule(r, delay, TimeUnit.MILLISECONDS);
        }
    
        /* 关闭线程池*/
        public static void unInit() {
            if (pool == null || pool.isShutdown()) return;
            map.clear();
           // pool.shutdown();
            pool.shutdownNow();
            pool = null;
        }
    
    
        //定时任务////////////////////////////////////////////////////////////////////
        /*该接口定义了线程的名字,用于管理,如判断是否存活,是否停止该线程等等*/
        public interface SRunnable extends Runnable {
            String getName();
        }
        private static HashMap<String, ScheduledFuture> map = new HashMap<>();
    
        /**
         * @param sr     需要执行测线程,该线程必须继承SRunnable
         * @param delay  延迟执行时间 1000毫秒
         * @param period 执行周期时间 1000毫秒
         */
        public static void stard(SRunnable sr, long delay, long period) {
            if (sr.getName() == null || map.get(sr.getName()) != null) {
                throw new UnsupportedOperationException("线程名不能为空或者线程名不能重复!");
            }
            if (pool == null || pool.isShutdown()) init();
            ScheduledFuture scheduledFuture = pool.scheduleAtFixedRate(sr, delay, period, TimeUnit.MILLISECONDS);
            map.put(sr.getName(), scheduledFuture);
        }
    
        /**
         * @param sr 停止当前正在执行的线程,该线程必须是继承SRunnable
         */
        public static void stop(SRunnable sr) {
            if (sr.getName() == null) {
                throw new UnsupportedOperationException("停止线程时,线程名不能为空!");
            }
            if (pool == null || pool.isShutdown()) return;//服务未启动
            if (map.size() > 0 && map.get(sr.getName()) != null) {
                map.get(sr.getName()).cancel(true);
                map.remove(sr.getName());
            }
            if (map.size() <= 0) {
                unInit();
            }
        }
    
        /**
         * 判断该线程是否还存活着,还在运行
         *
         * @param sr
         * @return
         */
        public static boolean isAlive(SRunnable sr) {
            if (map.size() > 0 && map.get(sr.getName()) != null) {
                return !map.get(sr.getName()).isDone();
            }
            return false;
        }
    }
    

    相关文章

      网友评论

          本文标题:ScheduledThreadPool 定时、延时任务--线程池

          本文链接:https://www.haomeiwen.com/subject/axkmextx.html