java 计划任务_Java创建计划任务/定时任务:Timer和TimerTask类详解

Timer是Jdk提供的一个定时器组件,不同于Swing中的Timer,他位于Java.util包中

Timer用后台的一个线程 定时或者重复的执行封装好的任务 任务被封装成TimerTask

TimerTask 是一个实现 Runable 接口的抽象类,把你需要执行的任务继承TimerTask即可

实例代码1. 使用Timer和TimerTask定时执行指定的任务

package jdk.timer.test;

import java.util.Date;

import java.util.Timer;

import java.util.TimerTask;

/**

* 一个简单的计划任务的例子

* @author Ericzhou

*

*/

public class TestTimer {

public static void main(String[] args) {

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

at(5);

}

public static void at(int timeout){

final Timer t = new Timer();

t.schedule(new TimerTask(){

@Override

public void run() {

System.out.println("time up..."+ new Date());

t.cancel(); //Run方法执行完成之后程序依然不会退出,可以采用cancel方法或者system.exit结束程序

}

}, new Date(new Date().getTime()+timeout*1000));

}

}

schedule() 方法用于指定timer在何时运行何种任务,他有很多重载的参数形式

可以使用delay或者精确的Date   与实现线程类似,TimerTask的实现类同样要实现run方法

我在这里使用了内部类

需要注意的是,任务执行完成后,线程并不会退出,可以有以下几种方法退出线程:

1.调用Timer的cancel() 方法

2.使用system.exit()方法

3.使timer指向新的引用

实例2.使用Timer重复执行指定任务

package jdk.timer.test;

import java.util.Timer;

import java.util.TimerTask;

/**

* @author Ericzhou

*/

public class TestRecycleTask {

public static void main(String[] args) {

Timer t = new Timer();

TimerTask task = new TimerTask(){

@Override

public void run() {

System.out.println("I am running...");

}

};

t.schedule(task,0,3*1000);

}

}

与实例一的区别就在于使用了另外一个schedule方法

public void schedule(TimerTask task,

long delay,

long period)

安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。

在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。

固定延迟执行适用于那些需要“平稳”运行的重复活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。

参数:

task - 所要安排的任务。

delay - 执行任务前的延迟时间,单位是毫秒。

period - 执行各后续任务之间的时间间隔,单位是毫秒。

抛出:

delay 是负数,或者 delay + System.currentTimeMillis() 是负数。

Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。

一个Timer可以调度任意多个TimerTask,它会将TimerTask存储在一个队列中,顺序调度,如果想两个TimerTask并发执行,则需要创建两个Timer。

0

1

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2010-07-22 14:59

浏览 3359

评论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值