日期:2014-05-17 浏览次数:20903 次
public class test extends TimerTask {
@Override
public void run() {
System.out.println("asdsdasd");
Timer timer = new Timer() ;
timer.schedule(new test(), new Date(System.currentTimeMillis()+2000)) ;
}
public static void main(String[] args) throws Exception {
Timer timer = new Timer() ;
timer.schedule(new test(), new Date(System.currentTimeMillis()+10000)) ;
}
------解决方案--------------------
package referer.test.csdn;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Test {
public static void main(String[] args) {
new Test();
}
private Timer t = new Timer();
private class MyTask extends TimerTask {
@Override
public void run() {
Calendar c = Calendar.getInstance();
// 处理该处理的程序
System.out.println("当前时间:" + c.getTime());
// 如果超过4点了就不执行了
if (c.get(Calendar.HOUR_OF_DAY) >= 4) {
return;
}
// 否则定时5分钟之后继续
c.set(Calendar.MINUTE, c.get(Calendar.MINUTE) + 5);
t.schedule(new MyTask(), c.getTime());
}
}
public Test() {
t.schedule(new MyTask(), getTime(3), 1000 * 60 * 60 * 24);
}
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
/**
* 获取当天之后1天的开始时间
*/
private Date getTime(int beginHour) {
Calendar c = Calendar.getInstance();
c.set(Calendar.DATE, c.get(Calendar.DATE) + 1);
c.set(Calendar.HOUR_OF_DAY, beginHour);
c.clear(Calendar.MINUTE);
c.clear(Calendar.SECOND);
return c.getTime();
}
}
------解决方案--------------------
Java 里面要实现这样的定时任务还有比较麻烦的,不建议自己去实现,把 Quartz 这个框架的 jar 加进来吧。对于你的这个用途,只用 Quartz 就可以了,不需要用什么 Spring 集成的。
如果需要自己实的话,可以使用 java.util.concurrent.DelayQueue,这个称为延迟队列,是 Java 集合框架的实现之一。存放进去的对象必须实现 java.util.concurrent.Delayed 和 java.lang.Comparable<T> 接口。在 Delayed 接口实现 public long getDelay(TimeUnit unit) 方法,如果在计算时返回值是小于等于 0 的话,那么在 DelayQueue 中使用 take 方法可以将其取出来。
我们可以在第一次往 DelayQueue 塞任务的时候,把下一次要执行的毫秒保存到这个任务对象中去。等时间一到,那 take 由阻塞状态变为运行状态,会将其中超时的对象取出来。取出来之后,计算下一次运行的毫秒数,再将这个对象塞回队列中去,同时在外部还有这个对象的引用,使用 ExecuteService 接口 submit 执行一次。