java定时程序方法 悟寰轩

1,定时凌晨1点执行(由于Quartz 2.0和spring目前版本不兼容,所以采取如下方法,不知道spring3.2会不会修复这个bug
       
public void doTask(CheckSpiderService doCheck) {
// 获取当前时间
Calendar currentDate = Calendar.getInstance();
long currentDateLong = currentDate.getTime().getTime();
// 计算满足条件的最近一次执行时间
Calendar earliestDate = getEarliestDate(currentDate, 1, 0, 0);
long earliestDateLong = earliestDate.getTime().getTime();
// 计算从当前时间到最近一次执行时间的时间间隔
long delay = earliestDateLong - currentDateLong;
// 计算执行周期为一天
long period = 24 * 60 * 60 * 1000;
ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
// 从现在开始delay毫秒之后,每隔一天执行一次,转换为毫秒
service.scheduleAtFixedRate(doCheck, delay, period, TimeUnit.MILLISECONDS);
}
public Calendar getEarliestDate(Calendar currentDate, int hourOfDay, int minuteOfHour, int secondOfMinite) {
// 计算当前时间的WEEK_OF_YEAR,DAY_OF_WEEK, HOUR_OF_DAY, MINUTE,SECOND等各个字段值
int currentHour = currentDate.get(Calendar.HOUR_OF_DAY);
int currentMinute = currentDate.get(Calendar.MINUTE);
int currentSecond = currentDate.get(Calendar.SECOND);
// 如果输入条件中的currentHour小于当前日期的dayOfWeek,则currentHour需要推迟一天
boolean dayLater = false;
if (hourOfDay < currentHour) {
dayLater = true;
} else if (hourOfDay == currentHour) {
// 当输入条件与当前日期的 hourOfDay相等时,
// 如果输入条件中的minuteOfHour小于当前日期的
// currentMinute,则WEEK_OF_YEAR需要推迟一天
if (minuteOfHour < currentMinute) {
dayLater = true;
} else if (minuteOfHour == currentSecond) {
// 当输入条件与当前日期的dayOfWeek, hourOfDay,
// minuteOfHour相等时,如果输入条件中的
// secondOfMinite小于当前日期的currentSecond,
// 则WEEK_OF_YEAR需要推迟一天
if (secondOfMinite < currentSecond) {
dayLater = true;
}
}
}
if (dayLater) {
// 设置当前日期中的WEEK_OF_YEAR为当前天推迟一天
currentDate.set(Calendar.DAY_OF_WEEK, currentDate.get(Calendar.DAY_OF_WEEK) + 1);
}
// 设置当前日期中的HOUR_OF_DAY,MINUTE,SECOND为输入条件中的值。
currentDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
currentDate.set(Calendar.MINUTE, minuteOfHour);
currentDate.set(Calendar.SECOND, secondOfMinite);
return currentDate;
}
2, java.util.Timer  第二种就比较简单了
继承 TimerTask
重写 run

public class TimerTest extends TimerTask {
@Override public void run() { syso("OK");} 
public static void main(String[] args) { 
 Timer timer = new Timer(); 
long delay = 2 * 1000; long period = 2000; 
// 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次 
timer.schedule(new TimerTest(), delay, period); 
 } 
 } 
3,Quartz 的应用
……这个不多说,内容很多。
public void schedule(TimerTask task,
  long delay) 说明:该方法会在设定的延时后执行一次任务。

public void schedule(TimerTask task,
  Date time) 说明:该方法会在指定的时间点执行一次任务。

public void schedule(TimerTask task,
  long delay,
  long period) 说明:该方法会在指定的延时后执行任务,并且在设定的周期定时执行任务。

public void schedule(TimerTask task,
  Date firstTime,
  long period) 说明:该方法会在指定的时间点执行任务,然后从该时间点开始,在设定的周期定时执行任务。特别的,如果设定的时间点在当前时间之前,任务会被马上执行,然后开始按照设定的周期定时执行任务。


想了解更多,可以参考:http://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/index.html
上的方法
 
原文地址:https://www.cnblogs.com/sunxucool/p/2800001.html