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

java 定时器中任务的启动、停止、再启动的更多相关文章

  1. 在Java应用中通过SparkLauncher启动Spark任务

    本博客内容基于Spark2.2版本,在阅读文章并想实际操作前,请确保你有: 一台配置好Spark和yarn的服务器 支持正常spark-submit --master yarn xxxx的任务提交 老 ...

  2. eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN

    eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...

  3. Linux Systemd——在RHEL/CentOS 7中启动/停止/重启服务

    RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Li ...

  4. 在CentOS 7中启动/停止/重启服务

    RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Li ...

  5. Java定时器演进过程和生产级分布式任务调度ElasticJob代码实战

    为何要使用分布式任务调度 **本人博客网站 **IT小神 www.itxiaoshen.com 演示项目源码地址** https://gitee.com/yongzhebuju/spring-task ...

  6. java swing中Timer类的学习

    最近在完成学校课程的java平时作业,要实现一个计时器,包含开始.暂停以及重置三个功能.由于老师规定要用这个timer类,也就去学习了一下,顺便记录一下. 首先呢去查了一下java手册上的东西,发现t ...

  7. java定时器实现总结

    前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架. 1. JDK组件(1) java.util.TimerTask MyTimerTask.java: ...

  8. SpringBoot项目快速启动停止脚本

    SpringBoot项目快速启动停止脚本 1.在jar包同级目录下,创建 app.sh #!/bin/bash appName=`ls|grep .jar$` if [ -z $appName ] t ...

  9. 关于 Java(TM) Platform SE binary 已停止工作 的解决方法

    一.问题描述 昨天晚上Myeclipse还用着好好的,今天早上打开工程,只要运行就卡住,大半天弹出个消息窗口:Java(TM) Platform SE binary 已停止工作. 如图 关闭Myecl ...

随机推荐

  1. vue-cli在控制台创建vue项目时乱码的问题

    新装的win10系统,使用vue-cli在控制台创建项目时出现乱码,请问如何处理? 解决: 打开cmd,在控制台输入CHCP 65001,按回车键即可将编码格式设成utf-8,再创建就不会乱码了. 执 ...

  2. Vs .Net Framework 灵活配置

    背景:我们开发和部署项目时都是通过注释某些配置项 比如: 在调试时就注释掉生产的配置项,在生产时又要改回来,只有一个还好,如果多的话就会非常容易出错. 问题1:在发布时容易出错,需要控制发布时根据配置 ...

  3. IntelliJ IDEA 项目结构旁边出现 0%classes,0% lines covered

    不知道一不小心点到哪里,项目变成如下形式 使用ctrl +  Alt + F6弹出如下框,取消勾选-->点击Show Selected就可以去掉了 官网解释

  4. GsonUtil工具类

    import java.util.ArrayList; import java.util.List; import java.util.Map; import com.google.gson.Gson ...

  5. python基础 - 字符串作

    split(sep=None, maxsplip=-1) 从左到右 sep 指定分隔字符串,缺省情况下空白字符串,指定的字符串会被切掉 maxsplit 指定分隔次数,-1 表示遍历 rsplit(s ...

  6. 搜索插入位置的golang实现

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 输入: [,,,], 输出: 输入: [,,,] ...

  7. 4、爬虫之mongodb

    mongodb 简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品 ...

  8. Swift开发实例:苹果Swift编程语言新手教程中文版+FlappyBird,2048游戏源代码

    源代码: 用IOS Swift语言实现的Flappy Bird源代码:http://download.csdn.net/detail/estellise/7449547 用IOS Swift实现的游戏 ...

  9. mysql用户操作、权限分配、远程登录设置

    对最近mysql的常用运维命令进行整理 查看使用的哪个配置文件启动的mysql 1. ps aux|grep mysql|grep 'my.cnf' 如果启动的命令中选择了配置文件,则可以查询出来,也 ...

  10. mascara-2(MetaMask/mascara本地实现)-连接线上钱包

    https://github.com/MetaMask/mascara (beta) Add MetaMask to your dapp even if the user doesn't have t ...