美文网首页
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