zoukankan      html  css  js  c++  java
  • 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()方法有时不一定会停止计划任务,而是正常执行。

  • 相关阅读:
    ACM: POJ 1401 Factorial-数论专题-水题
    ACM:POJ 2739 Sum of Consecutive Prime Numbers-素数打表-尺取法
    ACM: HDU 1028 Ignatius and the Princess III-DP
    ACM: HDU 2563 统计问题-DFS+打表
    ACM: How many integers can you find-数论专题-容斥原理的简单应用+GCD
    ACM: Happy 2004-数论专题-因子求和-快速幂
    ACM:a^b%p-数论-快速幂-快速乘
    ACM: 强化训练-Beautiful People-最长递增子序列变形-DP
    POJ 1472 Instant Complexity 应该叫它编程题。。
    POJ 3393 Lucky and Good Months by Gregorian Calendar 模拟题
  • 原文地址:https://www.cnblogs.com/dyh004/p/8485963.html
Copyright © 2011-2022 走看看