文档章节

任务调度(一)——jdk自带的Timer

白志华
 白志华
发布于 2015/10/18 10:55
字数 1244
阅读 3
收藏 0

       说到任务调度,大家可能会想到Quartz框架,但是jdk自带的简单任务调度工具类,反而了解的人并不是很多。我觉得如果你的业务相对简单的话,没必要非得用Quartz等框架,使用Timer完全可以胜任的。简单来分享一下我了解的Timer。


  Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。

  TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。


       我是用TimerTask来创建一个任务,其中run方法里是任务调度的逻辑。使用一个Timer对象来调度任务。


       首先给一个特别简单的示例:

package com.tgb.ccl.schema;

import java.util.Date;
import java.util.TimerTask;

/** 
 * 不可动态修改的任务
 * 
 * @author arron
 * @date 2015年5月7日 下午1:52:15 
 * @version 1.0 
 */
public class FixedTimerTask extends TimerTask{

	@Override
	public void run() {
		Date d = new Date();
		for(int i=0;i<3;i++){
			try {
				Thread.sleep(1000);
				System.out.println("已执行【"+(i+1)+"】秒钟,at: "+d.toLocaleString());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("本次任务调度结束,at: "+new Date().toLocaleString());
		System.out.println("---------------------------");
	}
	
}

package com.tgb.ccl.schema;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

/**
 * 任务调度管理器
 * 
 * @author arron
 * @date 2015年5月7日 下午1:57:19
 * @version 1.0
 */
public class TaskManager {
//	private static final long PERIOD = 5 * 60 * 1000;// 5分钟
	private static final long PERIOD = 5 * 1000;// 1秒钟

	public TaskManager() {
		Timer timer = new Timer();
		FixedTimerTask task = new FixedTimerTask();
		System.out.println("start");
		
		
		//0表示立即执行一次,以后每隔一段时间执行一次
		timer.schedule(task, 0, PERIOD);
		
		//1000表示1秒后执行一次,以后每隔一段时间执行一次
		//timer.schedule(task, 1000, PERIOD);
		
		//0表示立即执行一次,以后每隔一段时间执行一次
		//timer.schedule(task, 1000, PERIOD);
		
		// 在当天14点4分整,执行一次,以后不再执行
		//timer.schedule(task, bookTime(15,0,0));
		
		//在当天14点4分整,执行一次,以后每隔一段时间执行一次
		//如果时间超过了设定时间,会立即执行一次
//		timer.schedule(task, bookTime(0,34,10),PERIOD);
//		timer.scheduleAtFixedRate(task, bookTime(0,40,0),PERIOD);

	}
	

	private Date bookTime(int hour, int minute, int second) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, hour);
		calendar.set(Calendar.MINUTE, minute);
		calendar.set(Calendar.SECOND, second);
		Date date = calendar.getTime();
		return date;
	}
	
	public static void main(String[] args) {
		 new TaskManager();
	}
}

       只要执行main方法就可以测试了。


       大家可能已经注意到了,timer的schedule方法是重载的。参数主要有必须有一个TimerTask实例。第二个参数如果是long类型的,这个参数则是表示延迟时间,以毫秒为单位。如果为1000,那就是1秒后执行任务调度。如果是Date类型,则表示设定任务开始执行的时刻。当时间到达这个时刻,那么任务会自动开始调度。当然如果当前时间已经超过了设定的开始时间,那么会立即执行一次。第三个参数则是可选参数,是long类型的参数,表示调度的间隔时间。如果有这个参数,表示任务是重复性的调度。否则只会执行一次。这个参数依旧以毫秒为单位。


       如果你稍微注意一下,就会发现timer不只提供了schedule方法,还提供了scheduleAtFixedRate方法。这两个方法都是任务调度方法,他们有什么区别呢?


       区别在于当当前时间已经超过了设定执行时间,schedule方法会立即执行,第二次执行则是按当前执行时间+间隔时间来算的(当然任务执行时间超过了间隔时间,则在第一次执行完毕后,立马会执行第二次)。而scheduleAtFixedRate方法,同样是立即执行一次,但是它第二次执行则是按照(当前执行时间-设定的时间)/时间间隔来计算从设定时间到现在还需要执行多少次。


       举个例子:任务调度需要执行2s,间隔时间是10s,我设定的是8点执行。当前时间为8点0分10秒,如果是schedule方法,则会立即执行一次,第二次执行时间则是08:00:20。如果是scheduleAtFixedRate方法,则会立即执行一次,然后计算08:00:10-08:00:00整好还可以执行一次,所以会在08:00:12时,会立即再执行一次,第三次执行则是在08:00:20时执行,以后每隔10s执行一次。

   

(左图是schedule方法的测试效果,右图是scheduleAtFixedRate方法的测试效果)

       这个跟网上很多人说的不太一样。不过这个是我测试出来了。他们说的那种结果反正我是测不出来。具体你相信哪种,你自己试过就清楚了。


       下篇分享一下怎样动态修改Timer的调度计划,敬请期待。

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/xiaoxian8023/article/details/45569441

共有 人打赏支持
白志华
粉丝 30
博文 265
码字总数 57524
作品 0
长沙
程序员
实现Spring中的任务调度及异步执行

首先要端正一下本人的态度,开发了很长时间的Java Web项目,寄托于Spring MVC的架构,多数时间都是在处理业务逻辑问题,所以我个人单纯地认为Web开发,多线程的应用场景应该不多,能不用尽量...

chace0120
2014/08/01
0
1
任务调度开源框架Quartz动态添加、修改和删除定时任务

Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特...

pj7572780
2016/10/20
0
0
定时任务执行利器Timer和ScheduledThreadPoolExecutor使用

定时任务是在指定时间执行程序,或周期性执行计划任务。 Java中实现定时任务的方法有很多,主要JDK自带的一些方法以及开源程序如Qurtz。 1.Timer和TimerTask Timer只是充当了一个执行者的角色...

java_龙
01/03
0
0
几种任务调度的 Java 实现方法与比较1——阅读

综观目前的 Web 应用,多数应用都具备任务调度的功能。本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺点进行比较,目的在于给...

关河
2016/01/29
18
0
java定时调度器解决方案分类及特性介绍

什么是定时调度器? 我们知道程序的运行要么是由事件触发的,而这种事件的触发源头往往是用户通过ui交互操作层层传递过来的;但是我们知道还有另外一种由机器系统时间触发的程序运行场景。大...

杨武兵
2016/02/26
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
32分钟前
0
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
41分钟前
1
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
6
0
JavaEE——Junit

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Junit Junit又名单元测试,Junit是用来测试Jav...

凯哥学堂
昨天
4
0
读《美丽新世界》

一、背景 十一国庆节从重庆回深圳的时候,做得绿皮车,路上看了两本书:李笑来的《韭菜的自我修养》和禁书《美丽新世界》。 上篇文章已经分享了 读《韭菜的自我修养》,这篇文章来记录一下《...

tiankonguse
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部