Timer和TimerTask的使用

Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。

TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。

1、添加一个任务,继承实现TimerTask

public class TemplateTask extends TimerTask{
    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("正在执行我的任务");
    }
}

2、编写任务调度策略的范围接口

public interface SchedulerService {
    void schedule(TimerTask task, long delay);
    void schedule(TimerTask task, long delay, long period);
    void schedule(TimerTask task, Date firstTime, long period);
    void scheduleAtFixedRate(TimerTask task, long delay, long period);
    void scheduleAtFixedRate(TimerTask task, Date firstTime, long period);
}

3、实现任务策略接口

public class SchedulerServiceImpl implements SchedulerService {
    //延迟多长时间调用一次就陷入线程等待
    @Override
    public void schedule(TimerTask task, long delay) {
        new Timer().schedule(task, delay);
    }
   //延迟delay微秒调用一次,以后每隔period微秒执行一次
    @Override
    public void schedule(TimerTask task, long delay, long period) {
        new Timer().schedule(task, delay, period);
    }
   //从firstTime开始执行,每隔period微秒执行一次
    @Override
    public void schedule(TimerTask task, Date firstTime, long period) {
        new Timer().scheduleAtFixedRate(task, firstTime, period);
    }
   //延迟delay微秒调用一次,以后每隔period微秒执行一次:方法重在执行频率
    @Override
    public void scheduleAtFixedRate(TimerTask task, long delay, long period) {
        new Timer().scheduleAtFixedRate(task, delay, period);
    }
   //从firstTime开始执行,每隔period微秒执行一次:方法重在执行频率
    @Override
    public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) {
        new Timer().scheduleAtFixedRate(task, firstTime, period);
    }
}

注:建议使用schedule方法。

4、调度业务调用

public static void main(String[] args) {
        SchedulerService service=new SchedulerServiceImpl();
        // execute one time then the thread turn to wait status
        service.schedule(new TemplateTask(), 5*1000);
        // start from now every 5 seconds execute my task
//        service.schedule(new TemplateTask(), new Date(), 5*1000);
        //delay 5 seconds then as 5 seconds time-step to execute my task
//        service.schedule(new TemplateTask(), 5*1000, 5*1000);
//        service.scheduleAtFixedRate(new TemplateTask(), new Date(), 5*1000);
//        service.scheduleAtFixedRate(new TemplateTask(), 5*1000, 5*1000);
}

5、一个完整的小示例

package com.boonya.quartz;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Description:最简单的一个定时任务[如果使用web程序框架可以实现任务的动态调用:如spring(Spring MVC)的依赖注入功能]
 * @author boonya
 * @version 1.0 
 */
public class HelloWorld implements Job {

	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		System.out.println("Hello World : " + new Date());
	}

	public static void main(String[] args) throws SchedulerException {
		// 从工厂中返回一个scheduler实例
		SchedulerFactory schedulerFactory = new SchedulerFactoryImpl();
		Scheduler scheduler = schedulerFactory.getScheduler();
		//实例化一个具体任务
		JobDetail jobDetail = new JobDetail("helloWorldJobDetail",
				"helloWorldGroup", HelloWorld.class);
		//为这个任务添加触发器
		Trigger trigger = new SimpleTrigger("helloWorldTrigger",
				"helloWorldGroup", new Date(System.currentTimeMillis() + 3000),
				null, 5, 1 * 1000);	/* 第一个是Trigger的名称,第二个是Trigger的组名,第三个是任务开始时间,第四个是结束时间,第五个是重复次数
									 * (使用SimpleTrigger.REPEAT_INDEFINITELY常量可表示无限次),最后一个是重复周期(单位是毫秒)。
									 * 这里意义:开始3秒后执行一次 ,之后每1秒执行一次,执行5次。*/
		//将具体任务和触发器部署到调度器scheduler上,可部署多个job及触发器
		scheduler.scheduleJob(jobDetail, trigger);
		// 启动调度器,开始执行时间计划
		scheduler.start();
	}

}
6、注意事项

  • 每一个Timer仅对应唯一一个线程。
  • Timer不保证任务执行的十分精确。
  • Timer存在线程安全隐患。

转载于:https://my.oschina.net/boonya/blog/94054

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值