概述

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. VS2005宏无法运行的问题(打了补丁MS14-009之后)

    VS2005宏无法运行的问题(打了补丁MS14-009之后) 部门很多同事都是使用VS的宏来给源文件添加文件头,给函数.类添加注释等等,大概是14年2月份之后(根据lucifer提供的时间),这些宏突 ...

  2. 基于RTMP的实时流媒体的QoE分析

    Holly French等人在论文<Real Time Video QoE Analysis of RTMP Streams>中,研究了基于RTMP的实时视频的QoE.在此记录一下. 他们 ...

  3. LIRe 源代码分析 3:基本接口(ImageSearcher)

    ===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...

  4. LeetCode之“字符串”:Valid Number(由此引发的对正则表达式的学习)

    题目链接 题目要求: Validate if a given string is numeric. Some examples: "0" => true " 0.1 ...

  5. 图像处理程序框架—MFC相关知识点

    CDC:Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 . MFC基础类库定义了设备环境对象类----CDC类. CDC与CGdiObject的关系 说道 ...

  6. The 3rd tip of DB QueryAnalyzer

     The 3rd tip of DB Query Analyzer Ma Genfeng (Guangdong Unitoll Services incorporated, Guangzhou 510 ...

  7. Mac OS X下让ruby支持tcl/tk

    我记得在老早在OS X10.8下使用ruby1.9.x的时候只要到下载安装ActiveTcl8.5,没怎么配置就运行tk好好的.但是近日想重新执行下tk代码,发现在require 'tk'的时候就报错 ...

  8. ruby直接字符串压缩与解压缩

    ruby2.1.3的核心类中包含了Zlib库,其中的Zlib模块包含了对字符串压缩和解压的方法: irb(main):180:0> Zlib.class => Module irb(mai ...

  9. 一个div在另一个div中水平垂直的方法

    html <div id="main"> <div id="box"> 一个div在另一个div中垂直居中实现方法 </div&g ...

  10. OpenNMS安装手册

    一. 系统需求Windows Server 2008 R2 SP1 64位JDK 8 update 5 for Windows 64位PostgreSQL 9.3.5 for Windows 64位O ...