定时器Timer的使用
概述
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的使用的更多相关文章
- python中实现定时器Timer
实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...
- 订餐系统之定时器Timer不定时
经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统日志中会有警告,如果您有更好的方案 ...
- PHP框架Swoole的一个定时器Timer特性
在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...
- C#创建windows服务搭配定时器Timer使用实例(用代码做,截图版)
功能说明:C#创建一个windows服务,服务启动时D:\mcWindowsService.txt写入数据,服务运行期间每隔两秒写入当前时间. 原理这些就不说了,三语两语说不清楚,直接贴一个实例 ...
- iOS 定时器Timer常见问题
最近有朋友问我使用NStimer遇见与ScrollView并存时存在主线程阻塞的问题,自己总结几种解决方法: 问题原因: 一般定时器timer都会被以默认模式default添加到主线程的runloop ...
- 定时器Timer不定时
订餐系统之定时器Timer不定时 经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统 ...
- 多线程&定时器Timer&同步&线程通信&ThreadLocal
1.多线程 线程状态分为:新建状态.就绪状态.运行状态.阻塞状态.死亡状态 对象等待池的阻塞状态:运行状态执行了wait方法 对向锁池的阻塞状态:试图获得某个同步锁,已经被其他线程占用,就会放到对象的 ...
- Java进阶(十八)Java实现定时器(Timer)
Java实现定时器(Timer) 绪 在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类.java.u ...
- 定时器Timer&ScheduledThreadPoolExecutor
定时器Timer&ScheduledThreadPoolExecutor /** * @ClassName: TimerTest * @author: daniel.zhao * @date: ...
- JAVA多线程提高一:传统线程技术&传统定时器Timer
前面我们已经对多线程的基础知识有了一定的了解,那么接下来我们将要对多线程进一步深入的学习:但在学习之前我们还是要对传统的技术进行一次回顾,本章我们回顾的则是:传统线程技术和传统的定时器实现. 一.传统 ...
随机推荐
- Android官方技术文档翻译——清单合并
本文译自Android官方技术文档<Manifest Merger>,原文地址:http://tools.android.com/tech-docs/new-build-system/us ...
- 一张图解释NIO原理
- Shell Script - 追踪与debug
[root@www ~]# sh [-nvx] scripts.sh 选项与参数: -n :不要运行 script,仅查询语法的问题: -v :再运行 sccript 前,先将 scripts 的内容 ...
- OpenCV——PS滤镜,毛玻璃特效
程序完成 "毛玻璃" 特效, 不过边缘没有处理,使得最终的图像有黑边. 不过,有了黑边,感觉效果也不错,所以这个bug 没有管. #ifndef PS_ALGORITHM_H_IN ...
- 【Nginx】下载,请求限速,根据URL参数限速
这个场景是限制单个连接的下载速度,还有限制单个IP的连接数,或者单位时间内的请求数,实验环境 nginx1.9.x. 小例子为主,具体的细节请多看文档. 限制下载速度 location /downlo ...
- BCD码转十进制C语言实现
#include <stdio.h> #include <stdlib.h> #define uchar unsigned char uchar BCD_Decimal(uch ...
- C# 操作Excel数据透视表
一.概述 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等,可动态地改变透视表版面布置,也可以重新安排行号.列标和页字段.当改变版面布置时,数据透视表也会按照新的 ...
- 一个CSS背景颜色问题
div{ background: rgba(0,0,0,.1); background-color: #19FFFFFF; } 安卓下会显示上面的透明颜色,而在iOS上则显示下面的颜色,并且其 ...
- MOOS学习笔记2——HelloWorld回调
MOOS学习笔记2--HelloWorld回调 例程 #include "MOOS/libMOOS/Comms/MOOSAsyncCommClient.h" bool OnConn ...
- hive的高级查询(group by、 order by、 join 、 distribute by、sort by、 clusrer by、 union all等)
查询操作 group by. order by. join . distribute by. sort by. clusrer by. union all 底层的实现 mapreduce 常见的聚合操 ...