• java 定时器中任务的启动、停止、再启动


    package com.cvicse.ump.timer.service;
    
    import java.util.Date;
    import java.util.Timer;
    
    import com.cvicse.ump.timer.task.TimTaskTest;
    
    /**
     * 定时任务管理器
     * @author dyh
     *
     */
    public class TimerManager {
        
        /**
         * 单例模式
         */
        private static TimerManager timerManager = null;
        private TimerManager(){}
        public static TimerManager getInstance(){
            if(timerManager == null){
                timerManager = new TimerManager();
            }
            return timerManager;
        }
        
        /**
         * 定时器
         */
        private Timer timer = new Timer("homePageTimer");
        
        /**
         * 定时任务
         */
        private TimTaskTest timerTask = null;
        
        /**
         * 启动定时任务
         */
        public void startTimerTask(){
            timer.purge();
            if(timerTask==null){
                timerTask = new TimTaskTest();
            }
            timer.schedule(timerTask, new Date(), 5000);
        }
        
        /**
         * 定时任务取消
         */
        public void stopTimerTask(){
            timerTask.cancel();
            timerTask = null;//如果不重新new,会报异常
        }
    
    }

    TimerTask类和Timer类的cancel()方法详解

    无论是TimerTask类还是Timer类,其cancel()方法都是为了清除任务队列中的任务。

    虽然都是清除任务队列中的任务,却有一些不同:TimerTask类中的cancel()方法侧重的是将自身从任务队列中清除,其他任务不受影响,而Timer类中的cancel()方法则是将任务队列中全部的任务清空。

    下面以具体示例进行演示。 
    TimerTask类中的cancel()方法测试:

    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class Test {
    
        public static void main(String[] args) throws InterruptedException {
            System.out.println("当前时间为:" + new Date());
            Calendar c = Calendar.getInstance();
            Date runDate1 = c.getTime();
            System.out.println("计划时间为:" + runDate1);
            MyTaskA task1 = new MyTaskA();
            MyTaskB task2 = new MyTaskB();
            Timer timer = new Timer();
            timer.schedule(task1, runDate1, 4000);
            timer.schedule(task2, runDate1, 4000);
        }
    }
    
    class MyTaskA extends TimerTask {
    
        @Override
        public void run() {
            System.out.println("A run timer=" + new Date());
            this.cancel();// 调用的是TimerTask类中的cancel()方法
            System.out.println("A任务自己移除自己,B任务不受影响,继续运行");
        }
    
    }
    
    class MyTaskB extends TimerTask {
    
        @Override
        public void run() {
            System.out.println("B run timer=" + new Date());
        }
    
    }

    Timer类中的cancel()方法测试:

    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class Test {
    
        public static void main(String[] args) throws InterruptedException {
            System.out.println("当前时间为:" + new Date());
            Calendar c = Calendar.getInstance();
            Date runDate1 = c.getTime();
            System.out.println("计划时间为:" + runDate1);
            MyTaskA task1 = new MyTaskA();
            MyTaskB task2 = new MyTaskB();
            Timer timer = new Timer();
            timer.schedule(task1, runDate1, 4000);
            timer.schedule(task2, runDate1, 4000);
             Thread.sleep(12000);
             timer.cancel();
             System.out.println("A、B任务都移除了");
    
        }
    }
    
    class MyTaskA extends TimerTask {
    
        @Override
        public void run() {
            System.out.println("A run timer=" + new Date());
        }
    
    }
    
    class MyTaskB extends TimerTask {
    
        @Override
        public void run() {
            System.out.println("B run timer=" + new Date());
        }
    
    }

    **注意:**Timer类中的cancel()方法有时不一定会停止计划任务,而是正常执行。

  • 相关阅读:
    【笔记】求数据前n个主成分以及对高维数据映射为低维数据
    使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法
    【笔记】求数据的对应主成分PCA(第一主成分)
    【笔记】主成分分析法PCA的原理及计算
    【笔记】如何确定梯度计算的准确性以及调试梯度下降法
    【笔记】随机梯度下降法
    【笔记】线性回归中的梯度下降法(实现以及向量化并进行数据归一化)
    AttributeError: module 'numpy' has no attribute 'num'
    灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
    容器云在证券行业的探索与实践
  • 原文地址:https://www.cnblogs.com/dyh004/p/8485963.html
Copyright © 2020-2023  润新知