• 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() {
                执行
            }
        }
    }
  • 相关阅读:
    [Win32]一个调试器的实现(十)显示变量
    [Win32]一个调试器的实现(九)符号模型
    [Win32]一个调试器的实现(八)单步执行
    [Win32]一个调试器的实现(七)断点
    [Win32]一个调试器的实现(六)显示源代码
    [Win32]一个调试器的实现(五)调试符号
    [Win32]一个调试器的实现(四)读取寄存器和内存
    将博客搬至CSDN
    AndroidManifest.xml解析和五大布局介绍
    十六进制颜色
  • 原文地址:https://www.cnblogs.com/RealWorld/p/13410231.html
Copyright © 2020-2023  润新知