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() {
                执行
            }
        }
    }
  • 相关阅读:
    使用CTE分页 在MSSQL2005上可以使用
    uc_client目录
    用SQL语句添加删除修改字段
    for all your mad scientific needs think geek
    C++:Prototype模式去掉Clone方法
    linux命令:top
    linux命令:time
    C++:运行期断言和编译期断言
    内核分析:EXPORT_SYMBOL解析
    Linux工具:使用SED编辑器
  • 原文地址:https://www.cnblogs.com/RealWorld/p/13410231.html
Copyright © 2011-2022 走看看