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

  • 相关阅读:
    Android 剪贴板详解
    Android 7.1
    Windows 上安装 Redis 及可能出现的错误和解决方法!
    微信支付(服务商模式问题集)
    LOG4J日志问题 Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    Mysql强制修改密码
    Mysql密码忘记,修改密码方法
    笔记本最大支持内存查看方法
    Liunx操作指令搜素引擎
    tomcat启动时,内存溢出,Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
  • 原文地址:https://www.cnblogs.com/dyh004/p/8485963.html
Copyright © 2011-2022 走看看