java定时器框架_一个java定时器框架

ScheduleIterator接口

import java.util.Date;

public interface ScheduleIterator

{

public Date next();//获取下一个触发的时间点

}

Scheduler类

import java.util.Date;

import java.util.Timer;

import java.util.TimerTask;

public class Scheduler

{

class SchedulerTimerTask extends TimerTask

{

private SchedulerTask schedulerTask;

private ScheduleIterator iterator;

public SchedulerTimerTask(SchedulerTask schedulerTask,ScheduleIterator iterator)

{

this.schedulerTask = schedulerTask;

this.iterator = iterator;

}

public void run()

{

schedulerTask.run();

reschedule(schedulerTask, iterator);

}

}

private final Timer timer = new Timer();

public Scheduler()

{

}

public void cancel()

{

timer.cancel();

}

public void schedule(SchedulerTask schedulerTask,ScheduleIterator iterator)

{

Date time = iterator.next();

if (time == null)

{

schedulerTask.cancel();

}

else

{

synchronized(schedulerTask.lock)

{

if (schedulerTask.state != SchedulerTask.VIRGIN)

{

throw new IllegalStateException("Task already scheduled " +

"or cancelled");

}

schedulerTask.state = SchedulerTask.SCHEDULED;

schedulerTask.timerTask = new SchedulerTimerTask(schedulerTask, iterator);

timer.schedule(schedulerTask.timerTask, time);

}

}

}

private void reschedule(SchedulerTask schedulerTask,ScheduleIterator iterator)

{

Date time = iterator.next();

if (time == null)

{

schedulerTask.cancel();

}

else

{

synchronized(schedulerTask.lock)

{

if (schedulerTask.state != SchedulerTask.CANCELLED)

{

schedulerTask.timerTask = new SchedulerTimerTask(schedulerTask, iterator);

timer.schedule(schedulerTask.timerTask, time);

}

}

}

}

}

SchedulerTask 类

import java.util.TimerTask;

public abstract class SchedulerTask implements Runnable

{//被调度器不断调度执行的任务

final Object lock = new Object();

int state = VIRGIN;//任务状态

static final int VIRGIN = 0;

static final int SCHEDULED = 1;

static final int CANCELLED = 2;

TimerTask timerTask;//底层的定时器任务

protected SchedulerTask()

{

}

public abstract void run();//调度任务执行的具体任务

public boolean cancel()

{

synchronized(lock)

{

if (timerTask != null)

{

timerTask.cancel();//取消任务

}

boolean result = (state == SCHEDULED);//任务已经被调度执行

state = CANCELLED;//设置任务状态为“取消”

return result;

}

}

public long scheduledExecutionTime()

{

synchronized(lock)

{

return timerTask == null ? 0 : timerTask.scheduledExecutionTime();//任务执行时间

}

}

}

DailyIterator类:

import java.util.Calendar;

import java.util.Date;

public class DailyIterator implements ScheduleIterator {

private final int hourOfDay, minute, second;

private final Calendar calendar = Calendar.getInstance();

public DailyIterator(int hourOfDay, int minute, int second)

{

this(hourOfDay, minute, second, new Date());

}

public DailyIterator(int hourOfDay, int minute, int second, Date date)

{

this.hourOfDay = hourOfDay;

this.minute = minute;

this.second = second;

calendar.setTime(date);

calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);

calendar.set(Calendar.MINUTE, minute);

calendar.set(Calendar.SECOND, second);

calendar.set(Calendar.MILLISECOND, 0);

if (!calendar.getTime().before(date))

{

calendar.add(Calendar.DATE, -1);

}

}

public Date next()

{//获取下一个触发的时间点

calendar.add(Calendar.DATE, 1);

return calendar.getTime();

}

}

测试类:

import java.text.SimpleDateFormat;

import java.util.Date;

import org.tiling.scheduling.Scheduler;

import org.tiling.scheduling.SchedulerTask;

import org.tiling.scheduling.examples.iterators.DailyIterator;

public class AlarmClock

{

private final Scheduler scheduler = new Scheduler();//调度器

private final SimpleDateFormat dateFormat =

new SimpleDateFormat("dd MMM yyyy HH:mm:ss.SSS");

private final int hourOfDay, minute, second;//每天触发的时间点

public AlarmClock(int hourOfDay, int minute, int second)

{

this.hourOfDay = hourOfDay;

this.minute = minute;

this.second = second;

}

public void start()

{

scheduler.schedule(new SchedulerTask()

{

public void run()

{

soundAlarm();

}

private void soundAlarm()

{

System.out.println("Wake up! " +

"It's " + dateFormat.format(new Date()));

// Start a new thread to sound an alarm

}

}, new DailyIterator(hourOfDay, minute, second));//通过迭代器模式迭代遍历得到后面一系列的时间点

}

public static void main(String[] args)

{

AlarmClock alarmClock = new AlarmClock(22, 5, 0);

alarmClock.start();

}

}

参考资料

Scheduling recurring tasks in Java applications

本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/02/25/1081354.html,如需转载请自行联系原作者

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值