Calendar时间和Timer线程任务

  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值