概述

Timer类的主要作用是设置计划任务,但封装任务的类却是TimerTask类。执行计划任务的代码要放入TimerTask的子类中,因为TimerTask是一个抽象类。

方法schedule(task, delay)使用

schedule(task, delay)表示在将来的某个时间执行计划任务。

 /**
* 任务类
* @author ko
*
*/
public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("get last info..."+new Date().toString());
}
}
 /**
* 测试类
* @author ko
*
*/
public class Test {
public static void main(String[] args) {
Timer timer = new Timer();
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, 3);
System.out.println("1 "+new Date().toString());
timer.schedule(new MyTask(), calendar.getTime());
}
}

在3s后执行计划任务,虽然结果打印正确,但是红色按钮却一直亮着,代表线程还在运行,那这是怎么回事?

那是因为new一个TimerTask就是开一个线程,这个线程不是守护线程,会一直运行,可以改成守护线程

Timer timer = new Timer(true);

程序立马执行,但是计划任务不执行了。

如果计划执行的时间在当前时间之前,那么任务会立即执行

如果有多个TimerTask在用一个Timer下要执行,那么TimerTask不一定会按计划的时间执行,因为前面的task耗时可能会超过下一个任务执行的时间

 /**
* 测试类
* @author ko
*
*/
public class Test {
public static void main(String[] args) {
Timer timer = new Timer(false);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, 3);
System.out.println("1 "+new Date().toString());
timer.schedule(new MyTask(), calendar.getTime());
timer.schedule(new MyTask(), calendar.getTime());
}
}

测试类

 /**
* 任务类
* @author ko
*
*/
public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("get last info..."+new Date().toString());
System.out.println("要耗时5s...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

任务类

schedule(new MyTask(), calendar.getTime(), 3000)

在某个时间点执行计划任务,并且之后每隔Xs再次执行。

 /**
* 测试类
* @author ko
*
*/
public class Test {
public static void main(String[] args) {
Timer timer = new Timer(false);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, 3);
System.out.println("1 "+new Date().toString());
timer.schedule(new MyTask(), calendar.getTime(), 3000);
}
}
 /**
* 任务类
* @author ko
*
*/
public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("get last info..."+new Date().toString());
}
}

TaskTimer的cancel()方法使用

该方法会将自身从任务队列中清楚,需要注意的是如果该方法执行的时候,任务正在执行的话,不会立即终止任务,而是会等本次任务执行完,不再启动下次任务。

 /**
* 测试类
* @author ko
*/
public class Test {
public static void main(String[] args) {
Timer timer = new Timer(false);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, 3); MyTask t1 = new MyTask("t1");
timer.schedule(t1, calendar.getTime(),1000);
MyTask t2 = new MyTask("t2");
timer.schedule(t2, calendar.getTime(),1000); try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.cancel();
}
}
 /**
* 任务类
* @author ko
*
*/
public class MyTask extends TimerTask {
protected String tName; public MyTask(String tName) {
super();
this.tName = tName;
} @Override
public void run() {
System.out.println(tName + " get last info..."+new Date().toString());
}
}

可以看到执行t1任务被终止了。

Timer的cancel()方法使用

该方法会终止任务队列里的所有任务。

把上面代码的t1.cancel()换成timer.cancel()测试。

可以看到所有任务都被终止了。

scheduleAtFixedRate(task, delay, period)方法使用

scheduleAtFixedRate和schedule一样都会按顺序执行,所以不需要考虑非线程安全的情况。

scheduleAtFixedRate和schedule的区别只体现在不延时的情况下。

在不延时的情况下,schedule 下一次任务执行的时间参考的是上一次任务“开始”的时间。scheduleAtFixedRate下一次任务执行的时间参考的是上一次任务“结束”的时间。

在延迟的情况下,scheduleAtFixedRate和schedule都是参考的上一次任务“结束”的时间。

定时器Timer的使用的更多相关文章

  1. python中实现定时器Timer

    实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...

  2. 订餐系统之定时器Timer不定时

    经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统日志中会有警告,如果您有更好的方案 ...

  3. PHP框架Swoole的一个定时器Timer特性

    在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...

  4. C#创建windows服务搭配定时器Timer使用实例(用代码做,截图版)

       功能说明:C#创建一个windows服务,服务启动时D:\mcWindowsService.txt写入数据,服务运行期间每隔两秒写入当前时间. 原理这些就不说了,三语两语说不清楚,直接贴一个实例 ...

  5. iOS 定时器Timer常见问题

    最近有朋友问我使用NStimer遇见与ScrollView并存时存在主线程阻塞的问题,自己总结几种解决方法: 问题原因: 一般定时器timer都会被以默认模式default添加到主线程的runloop ...

  6. 定时器Timer不定时

    订餐系统之定时器Timer不定时 经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统 ...

  7. 多线程&定时器Timer&同步&线程通信&ThreadLocal

    1.多线程 线程状态分为:新建状态.就绪状态.运行状态.阻塞状态.死亡状态 对象等待池的阻塞状态:运行状态执行了wait方法 对向锁池的阻塞状态:试图获得某个同步锁,已经被其他线程占用,就会放到对象的 ...

  8. Java进阶(十八)Java实现定时器(Timer)

    Java实现定时器(Timer) 绪 在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类.java.u ...

  9. 定时器Timer&ScheduledThreadPoolExecutor

    定时器Timer&ScheduledThreadPoolExecutor /** * @ClassName: TimerTest * @author: daniel.zhao * @date: ...

  10. JAVA多线程提高一:传统线程技术&传统定时器Timer

    前面我们已经对多线程的基础知识有了一定的了解,那么接下来我们将要对多线程进一步深入的学习:但在学习之前我们还是要对传统的技术进行一次回顾,本章我们回顾的则是:传统线程技术和传统的定时器实现. 一.传统 ...

随机推荐

  1. C# BarCodeToHTML条码生成类

    来自:http://www.sufeinet.com/forum.php?mod=viewthread&tid=656&extra=page%3D1%26filter%3Dtypeid ...

  2. 【Android 应用开发】Android - TabHost 选项卡功能用法详解

    TabHost效果图 : 源码下载地址 : http://download.csdn.net/detail/han1202012/6845105        . 作者 :万境绝尘  转载请注明出处  ...

  3. how tomcat works 5 servlet容器 下

    上一节,我们主要说的是Wrapper容器,这一节我们说Context容器. 再重申一遍,一个Context容器可以包含多个Wrapper容器; 一个Wrapper容器就表示一个独立的servlet. ...

  4. C语言之数值计算--级数算法

    在编程语言的学习中,我们学习过不少的算法,比如累加,累乘,数值交换,排序等等.在一些软件比赛和面试题中,有一类算法不容忽视,属于高频题目,我之前去企业面试的时候就遇到这样的一类题目,题目不算难,掌握方 ...

  5. OpenCV——PS图层混合算法(六)

    具体的算法原理可以参考: PS图层混合算法之六(差值,溶解, 排除) // PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGO ...

  6. How to download the installation package by ZOL Downer

    How to download the installation package by ZOL Downer Ma Genfeng (Guangdong Unitoll Services incorp ...

  7. 杭电ACM 1004题

    原题大概意思就是统计输入字符串中,重复的最大个数! import java.util.Scanner; public class Main { public static void main(Stri ...

  8. 深入源码解析类Route

    微软官网对这个类的说明是:提供用于定义路由及获取路由相关信息的属性和方法.这个说明已经很简要的说明了这个类的作用,下面我们就从源码的角度来看看这个类的内部是如何工作的. public class Ro ...

  9. mysql6.5 操作日志

    创建用户并授权 grant all privileges on database.* to user@localhost identified by '123456'; flush privilege ...

  10. spring是如何管理 事务的

    Spring提供的事务管理可以分为两类:编程式的和声明式的.编程式的,比较灵活,但是代码量大,存在重复的代码比较多:声明式的比编程式的更灵活方便.  1.传统使用JDBC的事务管理  以往使用JDBC ...