Calendar设置时间
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
set()不立即计算时间
add(),get(), roll()立即计算时间
//设置开始时间
Calendar calendar = Calendar.getInstance () ;
int curHour = calendar.get(Calendar.HOUR_OF_DAY);
int curMin = calendar.get(Calendar.MINUTE);
int curSec = calendar.get(Calendar.SECOND);
//设置开始执行时间点
int valideHour=Integer.parseInt( "03" );
//计算偏移量 每天凌晨3点执行
calendar.setTimeInMillis(calendar.getTimeInMillis() - curHour * 3600000 - curMin * 60000 - curSec * 1000 + valideHour*3600000);
System.out.println(calendar.getTime());
Timer和TimerTask
Timer一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述令人讨厌的任务最终完成时才能够被快速连续地执行。
对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。默认情况下,任务执行线程并不作为守护线程 来运行,所以它能够阻止应用程序终止。如果调用方想要快速终止计时器的任务执行线程,那么调用方应该调用计时器的 cancel 方法。
创建守护线程任务Timer timer = new Timer(true);
守护线程,即Daemon Thread, 主要是指由虚拟机自己使用的起辅助作用的线程,比如垃圾回收线程(GC线程),而main线程则属于用户线程,也就是你所说的非守护线程.
守护线程不过是为其他线程提供服务的一种线程,除此之外没有其他的特别功能。如果一个程序的线程都是守护线程,那么该程序便没有运行的必要,该程序便退出。
如果在main线程中你调用了一个用户线程,并且用户线程未在main线程之前中止,那么即使main线程死了,程序也会继续运行下去。因为只有等所有的用户线程中止后,程序才能停止。
可daemon线程不同,由于它不是程序的本体,你可以把它理解为程序主体的寄生物,默默的在后面关注main线程,当main线程停止时,它自然也无法存在,消亡了。
Timer设置任务提供2种方法:schedule和scheduleAtFixedRate
schedule和scheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上。
比如
SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date d1 = fTime.parse("2007/04/25 14:10:00");
t.scheduleAtFixedRate(new TimerTask()...{
public void run()
...{
System.out.println("this is task you do");
}
},d1,3*60*1000);
间隔时间是3分钟,指定开始时间是2007/04/25 14:10:00,如果我在14:17:00分执行这个程序,那么会立刻打印3次
this is task you do //14:10
this is task you do //14:13
this is task you do //14:16
并且注意,下一次执行是在14:19 而不是 14:20。就是说是从指定的开始时间开始计时,而不是从执行时间开始计时。
但是上面如果用schedule方法,间隔时间是3分钟,指定开始时间是2007/04/25 14:10:00,那么在14:17:00分执行这个程序,则立即执行程序一次。并且下一次的执行时间是 14:20,而不是从14:10开始算的周期(14:19)。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/skyiceking/archive/2007/04/27/1587523.aspx