Java Timer及TimerTarsk(摘自网络)
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毫秒
打印日志信息:
- 1000
- ########第1次执行开始########
- ########第1次执行结束########
- 109
- ########第2次执行开始########
- ########第2次执行结束########
- 93
- ########第3次执行开始########
- ########第3次执行结束########
- 93
- ########第4次执行开始########
- ########第4次执行结束########
- 93
- ########第5次执行开始########
- ########第5次执行结束########
- 93
- ########第6次执行开始########
- ########第6次执行结束########
- 93
- ########第7次执行开始########
- ########第7次执行结束########
- 93
- ########第8次执行开始########
当将Thread.sleep(400);修改为Thread.sleep(600)时:
打印日志信息:
- 1000
- ########第1次执行开始########
- ########第1次执行结束########
- 0
- ########第2次执行开始########
- ########第2次执行结束########
- 0
- ########第3次执行开始########
- ########第3次执行结束########
- 0
- ########第4次执行开始########
- ########第4次执行结束########
- 0
- ########第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);
- }
Java Timer及TimerTarsk(摘自网络)的更多相关文章
- java并发多线程(摘自网络)
1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...
- Java Timer
Java Timer 定时类,主要用来执行定时任务 Timer管理所有要执行的定时任务 TimerTask封装好的定时任务 常见的用法 MyTask myTask = new MyTask(); Ti ...
- Android:控件WebView显示网页 -摘自网络
WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用. webview有两个方法:setWebChromeClient 和 setWebClient setWebClient:主要 ...
- Java Timer触发定时器
XML: <!-- Java Timer定时 --> <!-- <bean id="shortUrlTask" class=" com.sprin ...
- Java:利用java Timer类实现定时执行任务的功能
一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代 ...
- C# 中的内存管理,摘自网络
C#编程的一个优点是程序员不需要关心具体的内存管理,尤其是垃圾收集器会处理所有的内存清理工作.虽然不必手工管理内存,但如果要编写高质量的代码,还是要理解后台发生的事情,理解C#的内存管理.本文主要介绍 ...
- JAVA Timer定时器使用方法(二)
JAVA Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...
- 20155324 《Java程序设计》实验五 网络编程与安全
20155324 <Java程序设计>实验五 网络编程与安全 实验内容 任务一 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面功能中获取的表达式中 ...
- Ubuntu的常用快捷键(摘自网络)
篇一 : Ubuntu的复制粘贴操作及常用快捷键(摘自网络) Ubuntu的复制粘贴操作 1.最为简单,最为常用的应该是鼠标右键操作了,可以选中文件,字符等,右键鼠标,复制,到目的地右键鼠标,粘贴就结 ...
随机推荐
- noip 2016 提高组总结(不是题解)
小弱鸡杨树辰是第一次参加像noip这样的高大上的比赛,于是他非常,非常,非常激动. 当他第二天考完试后,他正在yy自己的分数:day1T1应该是a掉了,T2写了个30分的暴力,T3也是个40分的暴力, ...
- Tiny6410之重定位代码到SDRAM
在上一章中,将代码重定位到了SRAM中,但是这样的做法作用不大.正确的做法的是将代码重定位到更大的主存中,即DRAM.Tiny6410的DRAM控制寄存器最多只能支持两个同一类型的芯片.每个芯片最多可 ...
- linux服务器没网情况下手动安装软件几个方法
1,找到一个有网的服务器,使用yumdownloader gcc,获取需要的rmp包: 2,在http://pkgs.org 下下载所需要的rpm包
- mysql连接失败或出现“Too many connections”错误
mysql连接失败或出现"Too many connections"错误 # 按自己服务器的配置文件路径修改 vi /etc/my.cnf 查找:max_connections 修 ...
- Qt 学习笔记
继承自QObject 的Qt类都具有支持信号和槽的能力,并且在子类的实现代码中直接使用connect()函数 pwdLineEdit->setEchoMode(QLineEdit::Passwo ...
- Vimperator技巧
Vimperator技巧 什么是Vimperator?Firefox的一个插件,模拟vim操作. 1. 用]]打开"下一页"链接,[[打开"上一页"Vimper ...
- java中equals方法和contentEquals方法区别
java中,String类里提供了两种字符串的比较方式(算上“==”应该是三种) String line1 = new String("0123456789"); String l ...
- JQuery笔记(二)jq常用方法animate()
在jq中,比较方便的是相对于js,jq封装了很多方法,很方便使用,下面我举几个常用的方法 animate()方法 <!DOCTYPE html> <html lang="e ...
- 生成元(Digit Generator,ACM/ICPC Seoul 2005,UVa 1583)
#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;int t, n, a, ...
- JS算法与数据结构之八皇后(晕晕)
算法核心思想 回溯算法 递归实现 程序实现 坐标系 循环递归 回溯 计数 收集位置 特效添加 <!DOCTYPE HTML> <html> <head> <m ...