Java定时器是否提供实时保证_【Java基础】定时器Timer

简介

JDK提供的定时器,可以执行一些简单不复杂的任务,如果需要功能强大的定时器Quartz框架。

定时器任务的执行需要两个基本的类:

java.util.Timer

java.util.TimerTask

要运行一个定时任务,最基本的步骤如下:

1、建立一个要执行的任务TimerTask。

2、创建一个Timer实例,通过Timer提供的schedule()方法,将TimerTask加入到定时器Timer中,同时设置执行的规则即可。

当程序执行了Timer初始化代码后,Timer定时任务就会按照设置去执行。

Timer中的schedule()方法是有多种重载格式的,以适应不同的情况。该方法的格式如下:

void schedule(TimerTask task, Date time)

安排在指定的时间执行指定的任务。

void schedule(TimerTask task, Date firstTime, long period)

安排指定的任务在指定的时间开始进行重复的固定延迟执行。

void schedule(TimerTask task, long delay)

安排在指定延迟后执行指定的任务。

void schedule(TimerTask task, long delay, long period)

安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。

Timer是线程安全的,此类可扩展到大量同时安排的任务(存在数千个都没有问题)。其所有构造方法都启动计时器线程。可以调用cancel() 终止此计时器,丢弃所有当前已安排的任务。purge()从此计时器的任务队列中移除所有已取消的任务。此类不提供实时保证:它使用 Object.wait(long) 方法来安排任务。

TimerTask是一个抽象类,由 Timer 安排为一次执行或重复执行的任务。它有一个抽象方法run()----计时器任务要执行的操作。因此,每个具体的任务类都必须继承TimerTask类,并且重写run()方法。另外它还有两个非抽象的方法:

boolean cancel()

取消此计时器任务。

long scheduledExecutionTime()

返回此任务最近实际 执行的安排 执行时间。

例子

#1 简单应用

继承TimerTask,创建执行任务

class TimeTask1 extends TimerTask {

@Override

public void run() {

System.out.println(new Date());

// 实现定时要做的事情

System.out.println("爆炸!");

}

}

调度定时器

public class TimerTest1 {

public static void main(String[] args) {

// 创建一个TimerTask

TimerTask task = new TimeTask1();

Timer timer = new Timer();

// 调度,10秒后执行

// timer.schedule(task, 10000); // 10秒后爆炸(只执行一次)

timer.schedule(task, 10000, 2000); // 这个是第一次10秒后爆炸,然后每隔2秒爆炸(循环执行)。

}

}

执行结果

Tue Dec 22 23:31:23 CST 2015

爆炸!

Tue Dec 22 23:31:25 CST 2015

爆炸!

Tue Dec 22 23:31:27 CST 2015

爆炸!

Tue Dec 22 23:31:29 CST 2015

爆炸!

Tue Dec 22 23:31:31 CST 2015

爆炸!

......

#2 定时任务循环调用

创建定时执行任务

class TimeTask2 extends TimerTask {

@Override

public void run() {

System.out.println(new Date());

// 实现定时要做的事情

System.out.println("爆炸!");

new Timer().schedule(new TimeTask2(), 2000);

}

}

调动定时器

public class TimerTest2 {

public static void main(String[] args) {

// 创建一个TimerTask

TimerTask task = new TimeTask2();

Timer timer = new Timer();

timer.schedule(task, 2000); // 启动一个炸弹,然后该炸弹又启动了一个炸弹,然后循环炸下去。

}

}

执行结果

Tue Dec 22 23:38:09 CST 2015

爆炸!

Tue Dec 22 23:38:11 CST 2015

爆炸!

Tue Dec 22 23:38:13 CST 2015

爆炸!

Tue Dec 22 23:38:15 CST 2015

爆炸!

......

#3 指定时间启动定时器

创建定时执行任务

class TimeTask3 extends TimerTask {

@Override

public void run() {

System.out.println(new Date());

// 实现定时要做的事情

System.out.println("爆炸!");

}

}

调度定时器

public class TimerTest3 {

public static void main(String[] args) {

Calendar calendar=Calendar.getInstance();

int year=calendar.get(Calendar.YEAR); //获取当前的Year

int month=calendar.get(Calendar.MONTH);//获取当前的Month(0-11)

int day=calendar.get(Calendar.DAY_OF_MONTH);//获取当前的Day

//calendar.set(year, month, day,23,46,15); 表示定时在每天下午23:46:15执行

calendar.set(year, month, day,23,47,15);

// 创建一个TimerTask

TimerTask task = new TimeTask3();

Timer timer = new Timer();

// 调度

timer.schedule(task,calendar.getTime());

}

}

执行结果

Tue Dec 22 23:47:15 CST 2015

爆炸!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值