文档章节

Java中Timer的用法

TreasureWe
 TreasureWe
发布于 2015/10/12 09:24
字数 1504
阅读 440
收藏 6
点赞 0
评论 0

Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务。这种方式可以让程序按照某一个频度执行,但不能指定时间运行。用的较少。

任务的调用通过起的子线程进行执行。

java.util.Timer

java.util.TimerTask

一、调用方法:

(1)void java.util.Timer.schedule(TimerTask task, long delay):多长时间(毫秒)后执行任务

(2)void java.util.Timer.schedule(TimerTask task, Date time):设定某个时间执行任务

(3)void java.util.Timer.schedule(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(4)void java.util.Timer.schedule(TimerTask task, Date firstTime, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

(5)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(6)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

void java.util.Timer.cancel():终止该Timer

boolean java.util.TimerTask.cancel():终止该TimerTask

可以为每个Timer指定多个TimerTask


虽然可通过void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)方法完成“例如:每天上午10点执行一次”的业务,但该实现是基于进行一天(1000 * 60 * 60 * 24毫秒)进行延迟的机制实现的,并不是指定某个具体时间进行执行的。

对于该种需求,可通过Quartz来进行实现


二、方法名称schedule()和scheduleAtFixedRate()两者的区别

当需要根据period区间时间循环多次调用任务的时候,会存在两种不同的策略,两种方法提供了不同的策略。

调用方法(1)、(2)只是单次执行,不存在多次调用任务的情况,所以没有提供scheduleAtFixedRate方法的调用方式。

<1>schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
<2>scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period


三、示例

(1)

/** 
 * 第一种方法:设定多长时间(毫秒)后执行任务 
 */  
public static void timer1() {  
    final StopWatch watch = new StopWatch();  
    watch.start();  
    Timer timer = new Timer();  
    /* void java.util.Timer.schedule(TimerTask task, long delay) */  
    timer.schedule(new TimerTask() {  
        public void run() {  
            watch.stop();  
            System.out.println("-------任务执行--------");  
            System.out.println(watch.getTime());  
        }  
    }, 2000);// delay=2000毫秒 后执行该任务  
}

(2)

/** 
 * 第二种方法:设定某个时间执行任务 
 */  
public static void timer2() {  
    Calendar calendar = new GregorianCalendar();  
    calendar.add(Calendar.MINUTE, 1);  
    calendar.set(Calendar.SECOND, 0); // 一分钟后执行  
    Timer timer = new Timer();  
    /* void java.util.Timer.schedule(TimerTask task, Date time) */  
    timer.schedule(new TimerTask() {  
        @Override  
        public void run() {  
            System.out.println("-------任务执行--------");  
        }  
    }, calendar.getTime());  
}

(3)

/** 
 * 第三种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行 
 */  
public static void timer3() {  
    Timer timer = new Timer();  
    final StopWatch watch = new StopWatch();  
    watch.start();  
    System.out.println(Thread.currentThread().getName());  
    /* 
     * void java.util.Timer.schedule(TimerTask task, long delay, long 
     * period) 
     */  
    timer.schedule(new TimerTask() {  
        public void run() {  
            /* 子线程进行任务的执行 */  
            System.out.println(Thread.currentThread().getName());  
            System.out.println("-------设定要指定任务--------");  
            watch.suspend();  
            System.out.println(watch.getTime());  
            watch.reset();  
            watch.start();  
        }  
    }, 1000, 1000);  
}

(4)

/** 
 * 固定延迟peroid时间后执行;peroid时间不是以任务执行完的时间为计算起点(某次任务执行完成后,经过peroid时间后再次调用[不是这样的])。 
 * 而是每隔peroid时间调用任务一次。当任务执行的时间小于peroid时间,可以保证每隔peroid时间调用一次。 
 * 当任务的执行时间大于peroid时间时,从现象上看:任务一执行完,就会立刻进入下一次任务的执行 
 */  
public static void timer3a() {  
    Timer timer = new Timer();  
    final StopWatch watch = new StopWatch();  
    watch.start();  
    timer.schedule(new TimerTask() {  
        Integer i = 1;  
        public void run() {  
            System.out.println(watch.getTime());  
            System.out.println("########第" + i + "次执行开始########");  
            try {  
                Thread.sleep(400);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            System.out.println("########第" + i + "次执行结束########");  
            i++;  
            watch.reset();  
            watch.start();  
        }  
    }, 1000, 500);  
}

period:500毫秒;每次任务执行时间400毫秒;所以每次任务执行完成后到下一次任务调用开始的时间趋近于100毫秒

打印日志信息

  1. 1000  

  2. ########第1次执行开始########  

  3. ########第1次执行结束########  

  4. 109  

  5. ########第2次执行开始########  

  6. ########第2次执行结束########  

  7. 93  

  8. ########第3次执行开始########  

  9. ########第3次执行结束########  

  10. 93  

  11. ########第4次执行开始########  

  12. ########第4次执行结束########  

  13. 93  

  14. ########第5次执行开始########  

  15. ########第5次执行结束########  

  16. 93  

  17. ########第6次执行开始########  

  18. ########第6次执行结束########  

  19. 93  

  20. ########第7次执行开始########  

  21. ########第7次执行结束########  

  22. 93  

  23. ########第8次执行开始########  

当将Thread.sleep(400);修改为Thread.sleep(600)时:

打印日志信息:

  1. 1000  

  2. ########第1次执行开始########  

  3. ########第1次执行结束########  

  4. 0  

  5. ########第2次执行开始########  

  6. ########第2次执行结束########  

  7. 0  

  8. ########第3次执行开始########  

  9. ########第3次执行结束########  

  10. 0  

  11. ########第4次执行开始########  

  12. ########第4次执行结束########  

  13. 0  

  14. ########第5次执行开始########  

(5)

/** 
 * 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 
 * 每天中午12点都执行一次 
 */  
public static void timer4() {  
    Calendar calendar = Calendar.getInstance();  
    calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时  
    calendar.set(Calendar.MINUTE, 0); // 控制分  
    calendar.set(Calendar.SECOND, 0); // 控制秒  
  
    Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00  
  
    Timer timer = new Timer();  
    /* void java.util.Timer.schedule(TimerTask task, Date firstTime, long period) */  
    timer.schedule(new TimerTask() {  
        public void run() {  
            System.out.println("-------设定要指定任务--------");  
        }  
    }, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行  
}


(6)

/** 
 * 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。 
 * timer.schedule和timer.scheduleAtFixedRate的区别: 
 * (1)schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次 
 * (2)scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period 
 */  
public static void timer5() {  
    Timer timer = new Timer();  
    /* void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period) */  
    timer.scheduleAtFixedRate(new TimerTask() {  
        public void run() {  
            System.out.println("-------设定要指定任务--------");  
        }  
    }, 1000, 500);  
}


本文转载自:http://blog.csdn.net/eg366/article/details/11836017

共有 人打赏支持
TreasureWe
粉丝 6
博文 60
码字总数 27951
作品 0
潍坊
程序员
嵌入式 内存 数据库H2 Mixed Mode布署

Connection Modes The following connection modes are supported: Embedded mode (local connections using JDBC) Remote mode (remote connections using JDBC or ODBC over TCP/IP) Mixed......

JavaGG
2010/03/24
0
0
java并不认识python系列——谈谈搞混淆的@大法

怪自己二,曾一度理解java的@和python的@是类似的概念,在刷了python后,回头来再看java的注解各种懵逼,立下此文,以警后人,顺便,题段诗: python代码跑完后,冬雷滚滚夏雨雪。 java项目看...

守恒的猫
2017/11/03
0
0
Android之Handler用法总结

Android之Handler用法总结 方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问...

crystaltiger
2013/08/11
0
0
Android中实现定时器的四种方式

Android中实现定时器的四种方式 第一种方式利用Timer和TimerTask 1、继承关系 java.util.Timer 基本方法 schedule 例如: [java] view plaincopyprint? schedule方法有三个参数 第一个参数就...

Yao--靠自己
05/16
0
0
java连接各种数据库(mysql,sql server,oracle,db2)

MYSQL: private String conUrl ="jdbc:mysql://localhost:3306/数据库"网站推广 Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(conUrl,"用户名","密码"); S......

网络营销
2012/01/09
0
0
Tomcat6.0的Thisisverylikelytocreateamemoryleak异常

從Apache Tomcat 5.5升級到6.0,通常不用太大的修改,原有的Web Application就能繼續運作。不過在server.xml中設定MySQL Datasource,卻出現一串惱人的警告訊息: 2010/8/6 下午 01:54:11 o...

again-Y
2013/11/02
0
0
结合Dynamic .NET TWAIN和Jetty,实现基于网页的TWAIN文件扫描

网页TWAIN扫描是通过多种技术结合实现的,看下流程图: 参考原文: Web-based Document Imaging Capture with .Net TWAIN and Jetty 准备工作 阅读: 如何通过jni4net,在Java应用中调用C#接...

yushulx
2014/08/18
0
0
TimerTask 更新UI线程

今天在犯了一个愚蠢的错误,TimerTask中更新UI界面了,难怪半天没反应。 在网上搜了一篇Timer更新UI的帖子转过来。 错误写法: [java] view plaincopy package com.test; import java.util.T...

的书法上的
2014/06/12
0
0
Java多线程学习(五)线程间通信知识点补充

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
04/16
0
0
定时器 Quartz Java

1、几种任务调度的 Java 实现方法与比较 http://www.oschina.net/question/129540_28053 //特此感谢这篇文章的作者,我很喜欢这篇文章,里边介绍了好多关于目前定时器在工程中的使用,我总结...

soul_mate
2014/06/13
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway 接口文档聚合实现

在微服务架构下,通常每个微服务都会使用Swagger来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,毕竟懒是程序员的美德。 由于swagger2暂时不支持webflux 走...

冷冷gg
37分钟前
16
0
流利阅读笔记30-20180719待学习

1.今日导读 2.带着问题听讲解 3.新闻正文(中英文对照) 4.重点词汇 5.拓展内容

aibinxiao
40分钟前
1
0
OSChina 周五乱弹 —— 我们是食物链的最底层

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @温家成 :分享谢安琪的单曲《姿色份子》 《姿色份子》- 谢安琪 手机党少年们想听歌,请使劲儿戳(这里) @贪吃飒:最近p2p怎么了、半个月爆了...

小小编辑
53分钟前
7
1
Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
今天
0
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
9
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部