日期:2014-05-17 浏览次数:20725 次
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 执行一次。