概述

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. 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计

    本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...

  2. Debian系列软件管理(第二版)

    Debian系列软件管理 1.搜索软件包信息 apt-cache search apt-cache search yum 2.查看软件包信息 apt-cache show rpm 3.安装软件 apt ...

  3. Leetcode_203_Remove Linked List Elements

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/45868027 Remove all elements fr ...

  4. Eclipse修改工程名字

    1:修改项目目录下:.project文件 <?xml version="1.0" encoding="UTF-8"?> <projectDes ...

  5. C语言可变参实现参数累加返回

    C语言可变参的作用真的是非常大,自从发表了可变参如何实现printf,fprintf,sprintf的文章以来,便有不少博友私信问我实现的机制,我也解释了相关的知识点.今天,我们借着这个机会,再来举一 ...

  6. SharePoint 搜索爬网第三方网站配置

    介绍:SharePoint的搜索着实强大,而且最近用到SharePoint搜索第三方爬网,感觉收获挺大,而且网上资料没找到太多类似的,就小记录一下,分享给大家. 首先,我自己写了一个net页面,里面读 ...

  7. SharePoint2010 -- ECMAScript客户端模型简单示例

    ECMAScript客户端模型,是SharePoint2010推出的三种客户端模型".NET托管"."ECMAScript"."Sliverlight ...

  8. PHP获取指定地区的天气

    在开发网站的时候用到天气查询,由于是基于Wordpress的 所以有很多限制,先建一个[weather.php]的文件,然后看代码: <?php //获取天气 $url = 'http://m. ...

  9. C标准中关于空指针的那些事

    1 C标准不保证用所有二进制位都为0的变量来表示空指针,但它保证空指针与任何对象或函数的指针都不相等,取地址操作符&永远也不会返回空指针: 2 C标准称在指针上下文中的"值为0的整形 ...

  10. json的面向对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...