概述

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. Android表格布局(Table Layout)

    Android表格布局(Table Layout) 先来看布局管理器之间继承关系图: 图1 可知TableLayout继承了LinearLayout,所以表格布局本质上依然是线性管理器. 表格布局采用 ...

  2. 如何手动实现C语言中的字符串操作

    学了字符串操作,很多人也许学了大概知道怎么用,但是太久没用就忘了,恰恰这是找软件工程师或者嵌入式工程师以及C,C++相关的笔试面试必考的题目!接下来我们来看看如何手动实现这些相关的函数. 废话不多说, ...

  3. 怎样重建一个损坏的调用堆栈(callstack)

    原文作者:Aaron Ballman原文时间:2011年07月04日原文地址:http://blog.aaronballman.com/2011/07/reconstructing-a-corrupt ...

  4. BT币(金融有风险,投资需谨慎)哥的失败投资

    谁都知道bt币是一个旁氏骗局, 而进去的人,就必须保证自己不赔钱,所以只能随着大潮往前走,谁也不能让它跌 压垮骆驼的最后一根稻草, 还是幕后有个 推手, 在炒作 BT币, 事实上,作为新的投资项目,B ...

  5. error C3872: '0x3000': this character is not allowed in an identifier

    问题描述:这个字符不允许在标示符中使用 一般出这种错是因为你复制代码的时候,把不支持的字符复制进来了,这个字符就是中文空格,坑啊 解决: 把空格都删了,替换成英文的空格,就好了.

  6. LeetCode(36)- Implement Stack using Queues

    题目: Implement the following operations of a stack using queues. push(x) -- Push element x onto stack ...

  7. 如何使用firefox适用于javascript的debugger命令

    首先安装firebug,在firefox的扩展里搜索安装即可. 然后在页面中启用firebug中的脚本: 然后在网页某些位置加入debugger命令,比如如下页面代码: <!DOCTYPE ht ...

  8. Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能

    博客描述:后台返回地点的经纬度在地图上进行描点,点击导航弹出PopupWindow进行选择地图操作,如果手机中没有安装地图,提示没有,否则传值调起地图进行导航操作 看一下实现的效果,没图说再多都白搭 ...

  9. 超强js博客值得学习!!!

    再读ecmascript 摘要: 这几天,又花了点时间看了下ecmascript.以下是我摘录出来的一些理解.在此记录下.第一部分:关于变量对象的理解1) 什么是变量对象?数据的存取与读取机制,就是变 ...

  10. Charles手机抓包实用教程

    一.Charles官网下载链接:https://www.charlesproxy.com/download/ 二.抓包步骤: 1.安装Charles,并打开 2.电脑设置代理端口:打开charles- ...