zoukankan      html  css  js  c++  java
  • ScheduledExecutorService改为一次性延时任务

    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    import org.apache.log4j.Logger;
    
    /**
     * 一次性延时任务
     *
     * @author shay_deng
     * @since: v1.0
     */
    public class OneTimeScheduledExecutorService {
        private final static Logger logger = Logger.getLogger(OneTimeScheduledExecutorService.class);
                
        private Map<String, ScheduledExecutorService> taskMap = new HashMap<>();
    
        /**
         * 添加一个任务
         *
         * @param taskName
         *            任务名称
         * @param command
         *            任务
         * @param delay
         *            延时时间
         * @param unit
         *            时间单位
         */
        public void schedule(String taskName, Runnable command, long delay, TimeUnit unit) {
            if (!taskMap.containsKey(taskName)) {
                ScheduledExecutorService task = Executors.newScheduledThreadPool(1);
                Runnable run = new Runnable() {
                    public void run() {
    
                        command.run();//要做的事
    
                        if (taskMap.containsKey(taskName)) {// 执行完关闭任务
                            taskMap.get(taskName).shutdownNow();//用完要关掉,要不然占内存
                            taskMap.remove(taskName);
                            logger.info("一次性延时任务 -- >执行完成,删除任务 taskName="+taskName);
                        }
                    }
                };
                task.schedule(run, delay, unit);
                taskMap.put(taskName, task);
                logger.info("一次性延时任务 -- >添加任务 taskName="+taskName);
            }
        }
    
        /**
         * 中途终止任务
         *
         * @param taskName
         *            任务名称
         */
        public void shutdownNow(String taskName) {
            if (taskMap.containsKey(taskName)) {
                taskMap.get(taskName).shutdownNow();
                taskMap.remove(taskName);
                logger.info("一次性延时任务 -- >取消任务 taskName="+taskName);
            }
        }
        
        /**
         * 包含此任务
         *
         * @param taskName
         * @return
         */
        public boolean containsTask(String taskName) {
            return taskMap.containsKey(taskName);
        }
    }

    使用

    /**
     * 检查使用状态
     *
     * @author shay_deng
     * @since: v1.0
     */
    public class CheckUseStatus {
    
        private OneTimeScheduledExecutorService task = new OneTimeScheduledExecutorService();//一次性延时任务
    
        public void checkStatus() {
    
                            if (添加条件) {
                                if (!task.containsTask(taskName)) {
                                    Runnable run = new DelayTask(参数);
                                    long delay = xxx
                                    task.schedule(taskName, run, delay, TimeUnit.MINUTES);
                                }
                            }
                            else {取消
                                if (task.containsTask(taskName)) {
                                    task.shutdownNow(taskName);
                                }
                            }
    
        }
    
        /**
         * 任务
         *
         * @author shay_deng
         * @since: v1.0
         */
        class DelayTask implements Runnable {
    
            public DelayTask(参数) {
    
            }
    
            @Override
            public void run() {
                执行
            }
        }
    }
  • 相关阅读:
    Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题
    OpenCV Mat 只能用静态数组定义时初始化,动态数组赋值给Mat需要逐元素进行. MATLAB,OpenCV,VS混合编程
    【转】Ubuntu 10.10升级显卡驱动后开机动画低分辨率问题
    linux 文件[名]编码
    L337 Speak及国外论坛、IRC常用缩写
    UCS2 手机SMS的PDU编码
    setuid
    【转】CentOS5.5硬盘安装
    SWT CTabFolder 简记
    [转] 程序员的十层楼
  • 原文地址:https://www.cnblogs.com/RealWorld/p/13410231.html
Copyright © 2011-2022 走看看