import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import mytimer.util.Util;
/**任务记录类*/
public class TaskEntry {
public static final int TASK_START = 0; //定义两个表示任务记录状态常量
public static final int TASK_STOP = 1;
private Long oid; //任务ID号,唯一
private String name; //任务名称
private int state = TASK_STOP; //任务状态(启动/停止)
private Timer timer; //JAVA计时器
private TimePlan timePlan; //时间计划的类型
private AbstractTimerTask timerTask; //任务类的种子对象,由这个对象来不断克隆
private AbstractTimerTask runTimerTask; //运行计划的当前任务
/**
* ITaskEntry.taskStart()--TimerTask.run()--ITaskEntry.taskStart()
* 形成一个循环回路 。本方法负责起动本类代表的任务
*/
public void taskStart() {
if (timePlan.haveNext()) {
Date date = timePlan.nextDate();//得到任务计划时间
runTimerTask = timerTask.getCloneObject();//得到任务(复制)
timer.schedule(runTimerTask, date); //加入计划队列
//打印将要运行的计划任务的信息
Calendar c = Calendar.getInstance();
c.setTimeInMillis(runTimerTask.scheduledExecutionTime());
System.out.println(Util.dateToLongStr(c.getTime())+"将运行"+name);
} else {
state = TASK_STOP;
System.out.println(name + "结束");
}
}
/**停止任务*/
public void taskStop() {
if (runTimerTask != null) {
//打印信息
Calendar c = Calendar.getInstance();
c.setTimeInMillis(runTimerTask.scheduledExecutionTime());
System.out.println("计划于:"+Util.dateToLongStr(c.getTime())+"运行的" + name + "被终止");
//终止本任务, 调用Timer.cancel()是终止Timer的所有任务 。
runTimerTask.cancel();
} else {
System.out.println(name + "未进入执行计划");
}
}
……… 一些属性的get/set方法(省略)
/** 监听类(内部类) */
public static class DateBeforeTodayException extends NullPointerException {
private Date date;
public DateBeforeTodayException(Date date) {this.date = date;}
public String toString() {
return "计划时间(" + Util.dateToLongStr(date) + ")早于当前时间";
}
}
}
1、TimePlan是一个接口(interface) , 它是表示“运行计划的方案”,这个程序中提供了三种运行计划方案(见前图:计划任务的设置界面):
一次性运行 。
每隔一个时间段运行 。
一周中选择那几天运行 。
将它设计成一个接口是为了方便今后扩展,如果要新增新的时间方案只需要继承这个接口写一个新的实现即可 。三种时间方案的类图如下:
说明:
a) TimePlan封装了五个方法,其它haveNext()和nextDate()最重要 , 这个两个方法模仿了Java中集合类(Collection)的迭代器(Iterator)的设计形式,代码如下:
import java.util.Date;
//时间计划方案的接口
public interface TimePlan {
boolean haveNext();//判断还有没有下一个计划时间
Date nextDate();//得到下一个计划时间
Date getCurrentDate();//得到开始时间
void setCurrentDate(Date date); //设计开始时间
String getTimePlanString();//显示运行计划方案的文字说明
}
b) AbstractTimePlan是这个抽象类,主要目的是将一些各子类的公共方法写在这里 。代码如下:
import java.util.Date;
public abstract class AbstractTimePlan implements TimePlan {
//记录计划的第一时间点,除设置新的起始时间,否则不再改变
protected Date currentDate;
/*
当前计划的时间点,每次计划替换时被更新,
似乎这个才应叫cureentDate,sorry不想再改了
推荐阅读
- 为什么火山视频都要双击,为什么火山视频都要双击才能播放
- gis图层坐标系设置,gis坐标系转换
- 聚类图用excel怎么画,聚类分析图怎么分析数据
- 双男主养成小游戏推荐,双男主游戏推荐免费
- python函数简单代码 好玩又简单的python函数代码
- postgre字段顺序的简单介绍
- 怎么查手机号的主人,怎么查手机号的主人详细地址
- 软件毕业设计需要那些东西,软件毕业设计要求
- linux命令查看环境 linux命令查看环境变量