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

  • 相关阅读:
    Python学习札记(十五) 高级特性1 切片
    LeetCode Longest Substring Without Repeating Characters
    Python学习札记(十四) Function4 递归函数 & Hanoi Tower
    single number和变体
    tusen 刷题
    实验室网站
    leetcode 76. Minimum Window Substring
    leetcode 4. Median of Two Sorted Arrays
    leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions 、434. Number of Islands II(lintcode) 并查集 、178. Graph Valid Tree(lintcode)
    刷题注意事项
  • 原文地址:https://www.cnblogs.com/dyh004/p/8485963.html
Copyright © 2011-2022 走看看