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

  • 相关阅读:
    ios-点击图片放大,背景变半透明
    为代码分段标识
    方法的标签_With携带
    使用json要导入什么包
    Json中不支持任何形式的注释,那我们要怎么解决呢
    JFinal中文件上传后会默认放置到WebContent的upload包下,但是tomcat会自动重启,当我们再次打开upload文件夹查看我们刚刚上传的文件时,发现上传的文件已经没有了。
    JFinal上传文件时用getFile()方法报错
    JFinal文件上传时直接使用getPara()去接受表单的数据接收到的数据一直是null?
    Freemarker全部文档和具体实例
    Eclipse安装Freemarker插件
  • 原文地址:https://www.cnblogs.com/dyh004/p/8485963.html
Copyright © 2011-2022 走看看