一个java定时器框架
来源:互联网 发布:织梦云授权源码 编辑:程序博客网 时间:2024/06/06 14:01
ScheduleIterator接口
import java.util.Date;
public interface ScheduleIterator
{
public Date next();//获取下一个触发的时间点
}
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);
}
}
}
}
}
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();//任务执行时间
}
}
}
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.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();
}
}
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
- 一个java定时器框架
- 一个java定时器框架
- 一个java定时器框架
- 一个java定时器功能
- java中制作一个定时器
- [Java定时器]用Spring Task实现一个简单的定时器.
- 一个简单的定时器应用: VarTimer (java)
- [Java--定时器]--定时器举例
- 推荐一个Java缓存框架
- Java 一个优于Timer的定时器——ScheduledThreadPoolExecutor
- JAVA定时器
- java 定时器
- JAVA定时器
- java定时器
- JAVA定时器
- Java定时器
- JAVA定时器
- JAVA定时器
- 学习的逻辑: 知识经济学
- 关于字符串位移位
- U3D连连看
- JavaScript string 字符串类型的扩展方法(搜集整理)
- 基于redis分布式缓存实现
- 一个java定时器框架
- 用GRUB2来实现——坎特伯雷项目 The Canterbury Project
- 进程管理模拟--时间片轮转法与优先数法,欢迎提出意见
- Local File Manage in JavaScript Using FileSystemObject
- DataSet 绑定到GradView中
- Struts基础小结----Action配置与其他基础
- Oracle 字符集的查看和修改
- jquery 获取操作点击时所需操作的记录的ID号
- 函数返回值—返回局部变量