前段时间在做一个考试系统时候,遇到一个问题,发起一系列的考试后,要满足一个需求,就是能够设定时间来批量开始和结束一些列的考试,这里就想到使用timer了,
前台的代码就省略不写了,这里只讨论timer的使用
以下的方法autoOperatorExam(String idStr, String time, String type);三个参数分别是批量处理的id,设定的时间,类型(即是开始操作还是结束操作);
//自动开始结束考试
public void autoOperatorExam(String idStr, String time, String type){
String[] ids = idStr.split("-");
for(String id: ids){
examDAO.updateExamTime(Integer.valueOf(id), time, type);
/*
* 此处采用计时器来代替线程的等待
* 如果使用线程,必须要将线程的任务全执行完后才能向下执行,而计时器实现了后台
* 执行的功能
* */
Timer timer = new Timer();
//计算时间的间隔
String timeStr = null;
try {
timeStr = FormatDate.examRemainTime(FormatDate.getFormateDateAll(), time);
} catch (ParseException e) {
System.out.println("计算时间差出错!!");
e.printStackTrace();
}
//System.out.println(timeStr);
String[] timeString = timeStr.split("#");
Integer timeSpace = (Integer.valueOf(timeString[0])*60)+Integer.valueOf(timeString[1]);
System.out.println("时间的间隔是=" +timeSpace);
if("开始时间".equals(type)){
//这里通过构造方法将参数传递给run()方法
timer.schedule(new autoUpdateStatusStart(Integer.valueOf(id)), (Integer.valueOf(timeSpace)*1000));
}else if("结束时间".equals(type)){
timer.schedule(new autoUpdateStatusEnd(Integer.valueOf(id)), (Integer.valueOf(timeSpace)*1000));
}
}
}
这里面看实例化了autoUpdateStatusStart();和autoUpdateStatusEnd();通过实例化可以将参数传递给内部方法run();
//计时器的具体任务操作,开始考试
public class autoUpdateStatusStart extends TimerTask{
private int taskID = 0; //任务id
public autoUpdateStatusStart(int ID){ this.taskID = ID;
}
public void run() {
System.out.println("开始考试的考生id= " + taskID);
Exam exam = examDAO.getExamById(taskID);
exam.setExamStatus("开始");
exam.setExamStartime("已生效!!");
examDAO.update(exam);
System.out.println("开始已成功执行!!!");
}
}
//结束考试的run操作
public class autoUpdateStatusEnd extends TimerTask{
private int taskID = 0; //任务id
public autoUpdateStatusEnd(int ID){ this.taskID = ID;
}
public void run() {
System.out.println("结束考试的考生id= "+taskID);
Exam exam = examDAO.getExamById(taskID);
exam.setExamStatus("结束");
exam.setExamEndtime("已生效!!");
examDAO.update(exam);
System.out.println("结束已成功执行!!!");
}
}
这样程序就能在后台进行时间的控制执行所要的操作