Java定时器Timer简述
概述
主要用于Java线程里指定时间或周期运行任务。Timer是线程安全的,但不提供实时性(real-time)保证。
构造函数
Timer()
默认构造函数。
Timer(boolean)
指定关联线程是否作为daemon线程。
Timer(String)
指定关联线程的名称。
Timer(String,boolean)
同时指定关联线程的名称和是否作为daemon。
schdule方法
schedule(TimerTasktask,longdelay)
以当前时间为基准,延迟指定的毫秒后执行一次TimerTask任务。
schedule(TimerTasktask,Datetime)
在指定的日期执行一次TimerTask任务。
如果日期time早于当前时间,则立刻执行。
使用示例
publicclassDemo{ privatestaticTimertimer=newTimer(); publicstaticclassMyTaskextendsTimerTask{ @Override publicvoidrun(){ System.out.println("RunTime:"+newDate().toString()); } } publicstaticvoidmain(String[]args){ try{ MyTasktask=newMyTask(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringdateStr="2016-12-2714:36:00"; Datedate=sdf.parse(dateStr); System.out.println("Date="+date.toString()+"NowTime="+newDate().toString()); timer.schedule(task,date); }catch(ParseExceptione){ e.printStackTrace(); } } }
执行结果
Date=TueDec2714:36:00CST2016NowTime=TueDec2721:28:04CST2016 RunTime:TueDec2721:28:04CST2016
说明是立刻执行。
schedule(TimerTasktask,longdelay,longperiod)
以当前时间为基准,延迟指定的毫秒后,再按指定的时间间隔地无限次数的执行TimerTask任务。(fixed-delayexecution)
使用示例
publicclassDemo{ privatestaticTimertimer=newTimer(); publicstaticclassMyTaskextendsTimerTask{ @Override publicvoidrun(){ System.out.println("RunTime:"+newDate().toString()); } } publicstaticvoidmain(String[]args){ MyTasktask=newMyTask(); System.out.println("NowTime:"+newDate().toString()); timer.schedule(task,3000,5000); } }
执行结果
NowTime:TueDec2721:34:59CST2016 RunTime:TueDec2721:35:02CST2016 RunTime:TueDec2721:35:07CST2016 RunTime:TueDec2721:35:12CST2016 RunTime:TueDec2721:35:17CST2016
说明以当前基准时间延迟3秒后执行一次,以后按指定间隔时间5秒无限次数的执行。
schedule(TimerTasktask,DatefirstTime,longperiod)
在指定的日期之后,按指定的时间间隔地无限次数的执行TimerTask任务。(fixed-delayexecution)
如果日期firstTime早于当前时间,则立刻执行,且不执行在时间差内的任务。
使用示例
publicclassDemo{ privatestaticTimertimer=newTimer(); publicstaticclassMyTaskextendsTimerTask{ @Override publicvoidrun(){ System.out.println("RunTime:"+newDate().toString()); } publicstaticvoidmain(String[]args){ try{ MyTasktask=newMyTask(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringdateStr="2016-12-2714:36:00"; Datedate=sdf.parse(dateStr); System.out.println("Date="+date.toString()+"NowTime="+newDate().toString()); timer.schedule(task,date,3000); }catch(ParseExceptione){ e.printStackTrace(); } } } }
执行结果
Date=TueDec2714:36:00CST2016NowTime=TueDec2721:43:30CST2016 RunTime:TueDec2721:43:30CST2016 RunTime:TueDec2721:43:33CST2016 RunTime:TueDec2721:43:36CST2016
说明指定的之间早于当前时间,则立刻执行,不会补充时间差内的任务。
scheduleAtFixedRate方法
scheduleAtFixedRate(TimerTasktask,longdelay,longperiod)
以当前时间为基准,延迟指定的毫秒后,再按指定的时间间隔周期性地无限次数的执行TimerTask任务。(fixed-rateexecution)
使用示例
publicclassDemo{ privatestaticTimertimer=newTimer(); publicstaticclassMyTaskextendsTimerTask{ @Override publicvoidrun(){ System.out.println("RunTime:"+newDate().toString()); } } publicstaticvoidmain(String[]args){ MyTasktask=newMyTask(); System.out.println("NowTime:"+newDate().toString()); timer.scheduleAtFixedRate(task,3000,5000); } }
执行结果
NowTime:TueDec2721:58:03CST2016 RunTime:TueDec2721:58:06CST2016 RunTime:TueDec2721:58:11CST2016 RunTime:TueDec2721:58:16CST2016 RunTime:TueDec2721:58:21CST2016
说明以当前基准时间延迟3秒后执行一次,以后按指定间隔时间5秒无限次数的执行。
scheduleAtFixedRate(TimerTasktask,DatefirstTime,longperiod)
在指定的日期之后,按指定的时间间隔周期性地无限次数的执行TimerTask任务。(fixed-rateexecution)
如果日期firstTime早于当前时间,则立即执行,并补充性的执行在时间差内的任务。
使用示例
publicclassDemo{ privatestaticTimertimer=newTimer(); publicstaticclassMyTaskextendsTimerTask{ @Override publicvoidrun(){ System.out.println("RunTime:"+newDate().toString()); } publicstaticvoidmain(String[]args){ try{ MyTasktask=newMyTask(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringdateStr="2016-12-2722:02:00"; Datedate=sdf.parse(dateStr); System.out.println("Date="+date.toString()+"NowTime="+newDate().toString()); timer.scheduleAtFixedRate(task,date,5000); }catch(ParseExceptione){ e.printStackTrace(); } } } }
执行结果
Date=TueDec2722:02:00CST2016NowTime=TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:54CST2016 RunTime:TueDec2722:02:55CST2016 RunTime:TueDec2722:03:00CST2016 RunTime:TueDec2722:03:05CST2016
说明指定的之间早于当前时间,则立刻执行。
在时间22:02:00--22:02:54内大约有11个5秒间隔,则优先补充性的执行在时间差内的任务,然后在22:02:55补充完毕(执行12次。ps:0-55秒区间段内首位都算上,正好触发12次),此后每隔5秒执行一次定时任务。
执行任务延时对比之schedule和scheduleAtFixedRate
schedule不延时
使用示例
publicclassDemo{ privatestaticTimertimer=newTimer(); privatestaticintrunCount=0; publicstaticclassMyTaskextendsTimerTask{ @Override publicvoidrun(){ try{ System.out.println("BeginRunTime:"+newDate().toString()); Thread.sleep(3000); System.out.println("EndRunTime:"+newDate().toString()); runCount++; if(runCount==3){ timer.cancel(); } }catch(InterruptedExceptione){ e.printStackTrace(); } } } publicstaticvoidmain(String[]args){ try{ MyTasktask=newMyTask(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringdateStr="2016-12-2714:36:00"; Datedate=sdf.parse(dateStr); System.out.println("Date="+date.toString()+"NowTime="+newDate().toString()); timer.schedule(task,date,5000); }catch(ParseExceptione){ e.printStackTrace(); } } }
执行结果
早于当前基准时间
Date=TueDec2714:36:00CST2016NowTime=TueDec2722:23:37CST2016 BeginRunTime:TueDec2722:23:37CST2016 EndRunTime:TueDec2722:23:40CST2016 BeginRunTime:TueDec2722:23:42CST2016 EndRunTime:TueDec2722:23:45CST2016 BeginRunTime:TueDec2722:23:47CST2016 EndRunTime:TueDec2722:23:50CST2016 Processfinishedwithexitcode0
晚于当前基准时间
Date=TueDec2722:42:00CST2016NowTime=TueDec2722:41:54CST2016 BeginRunTime:TueDec2722:42:00CST2016 EndRunTime:TueDec2722:42:03CST2016 BeginRunTime:TueDec2722:42:05CST2016 EndRunTime:TueDec2722:42:08CST2016 BeginRunTime:TueDec2722:42:10CST2016 EndRunTime:TueDec2722:42:13CST2016 Processfinishedwithexitcode0
不管早还是晚于基准时间,都不进行补偿,下一次任务的执行时间参考的是上一次任务的开始时间点来计算。
schedule延时
使用示例
publicclassDemo{ privatestaticTimertimer=newTimer(); privatestaticintrunCount=0; publicstaticclassMyTaskextendsTimerTask{ @Override publicvoidrun(){ try{ System.out.println("BeginRunTime:"+newDate().toString()); Thread.sleep(5000); System.out.println("EndRunTime:"+newDate().toString()); runCount++; if(runCount==3){ timer.cancel(); } }catch(InterruptedExceptione){ e.printStackTrace(); } } } publicstaticvoidmain(String[]args){ try{ MyTasktask=newMyTask(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringdateStr="2016-12-2722:42:00"; Datedate=sdf.parse(dateStr); System.out.println("Date="+date.toString()+"NowTime="+newDate().toString()); timer.schedule(task,date,3000); }catch(ParseExceptione){ e.printStackTrace(); } } }
执行结果
早于当前基准时间
Date=TueDec2722:42:00CST2016NowTime=TueDec2722:45:17CST2016 BeginRunTime:TueDec2722:45:17CST2016 EndRunTime:TueDec2722:45:22CST2016 BeginRunTime:TueDec2722:45:22CST2016 EndRunTime:TueDec2722:45:27CST2016 BeginRunTime:TueDec2722:45:27CST2016 EndRunTime:TueDec2722:45:32CST2016 Processfinishedwithexitcode0
晚于当前基准时间
Date=TueDec2722:47:00CST2016NowTime=TueDec2722:46:27CST2016 BeginRunTime:TueDec2722:47:00CST2016 EndRunTime:TueDec2722:47:05CST2016 BeginRunTime:TueDec2722:47:05CST2016 EndRunTime:TueDec2722:47:10CST2016 BeginRunTime:TueDec2722:47:10CST2016 EndRunTime:TueDec2722:47:15CST2016 Processfinishedwithexitcode0
不管早还是晚于当前基准时间,都不进行补偿,下一次任务的执行时间都是参考上一次任务结束的时间点来计算。
scheduleAtFixedRate不延时
使用示例
publicclassDemo{ privatestaticTimertimer=newTimer(); privatestaticintrunCount=0; publicstaticclassMyTaskextendsTimerTask{ @Override publicvoidrun(){ try{ System.out.println("BeginRunTime:"+newDate().toString()); Thread.sleep(3000); System.out.println("EndRunTime:"+newDate().toString()); runCount++; if(runCount==1000){ timer.cancel(); } }catch(InterruptedExceptione){ e.printStackTrace(); } } } publicstaticvoidmain(String[]args){ try{ MyTasktask=newMyTask(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringdateStr="2016-12-2722:51:42"; Datedate=sdf.parse(dateStr); System.out.println("Date="+date.toString()+"NowTime="+newDate().toString()); timer.scheduleAtFixedRate(task,date,5000); }catch(ParseExceptione){ e.printStackTrace(); } } }
执行结果
早于当前基准时间
Date=TueDec2722:51:42CST2016NowTime=TueDec2722:51:57CST2016 BeginRunTime:TueDec2722:51:57CST2016 EndRunTime:TueDec2722:52:00CST2016 BeginRunTime:TueDec2722:52:00CST2016 EndRunTime:TueDec2722:52:03CST2016 BeginRunTime:TueDec2722:52:03CST2016 EndRunTime:TueDec2722:52:06CST2016 BeginRunTime:TueDec2722:52:06CST2016 EndRunTime:TueDec2722:52:09CST2016 BeginRunTime:TueDec2722:52:09CST2016 EndRunTime:TueDec2722:52:12CST2016 BeginRunTime:TueDec2722:52:12CST2016 EndRunTime:TueDec2722:52:15CST2016 BeginRunTime:TueDec2722:52:15CST2016 EndRunTime:TueDec2722:52:18CST2016 BeginRunTime:TueDec2722:52:18CST2016 EndRunTime:TueDec2722:52:21CST2016 BeginRunTime:TueDec2722:52:22CST2016 EndRunTime:TueDec2722:52:25CST2016 BeginRunTime:TueDec2722:52:27CST2016 EndRunTime:TueDec2722:52:30CST2016 BeginRunTime:TueDec2722:52:32CST2016 EndRunTime:TueDec2722:52:35CST2016 BeginRunTime:TueDec2722:52:37CST2016 EndRunTime:TueDec2722:52:40CST2016 BeginRunTime:TueDec2722:52:42CST2016 EndRunTime:TueDec2722:52:45CST2016 BeginRunTime:TueDec2722:52:47CST2016 EndRunTime:TueDec2722:52:50CST2016 BeginRunTime:TueDec2722:52:52CST2016 EndRunTime:TueDec2722:52:55CST2016 BeginRunTime:TueDec2722:52:57CST2016 EndRunTime:TueDec2722:53:00CST2016 Processfinishedwithexitcode0
晚于当前基准时间
Date=TueDec2722:37:00CST2016NowTime=TueDec2722:36:06CST2016 BeginRunTime:TueDec2722:37:00CST2016 EndRunTime:TueDec2722:37:03CST2016 BeginRunTime:TueDec2722:37:05CST2016 EndRunTime:TueDec2722:37:08CST2016 BeginRunTime:TueDec2722:37:10CST2016 EndRunTime:TueDec2722:37:13CST2016 Processfinishedwithexitcode0
不延时的情况下,当早于基准时间时,时间差内的执行任务未补偿完时,下一次执行任务的时间参考的是上一次执行任务的结束时间;一旦补偿完毕(注意粗体时间点),下一次执行任务的时间参考的是上一次执行任务的开始时间;当晚于基准时间时,下一次执行任务的时间参考的是上一次执行任务的开始时间。
scheduleAtFixedRate延时
使用示例
publicclassDemo{ privatestaticTimertimer=newTimer(); privatestaticintrunCount=0; publicstaticclassMyTaskextendsTimerTask{ @Override publicvoidrun(){ try{ System.out.println("BeginRunTime:"+newDate().toString()); Thread.sleep(5000); System.out.println("EndRunTime:"+newDate().toString()); runCount++; if(runCount==3){ timer.cancel(); } }catch(InterruptedExceptione){ e.printStackTrace(); } } } publicstaticvoidmain(String[]args){ try{ MyTasktask=newMyTask(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringdateStr="2016-12-2722:28:00"; Datedate=sdf.parse(dateStr); System.out.println("Date="+date.toString()+"NowTime="+newDate().toString()); timer.scheduleAtFixedRate(task,date,3000); }catch(ParseExceptione){ e.printStackTrace(); } } }
执行结果
早于当前基准时间
Date=TueDec2723:01:00CST2016NowTime=TueDec2723:01:19CST2016 BeginRunTime:TueDec2723:01:19CST2016 EndRunTime:TueDec2723:01:24CST2016 BeginRunTime:TueDec2723:01:24CST2016 EndRunTime:TueDec2723:01:29CST2016 BeginRunTime:TueDec2723:01:29CST2016 EndRunTime:TueDec2723:01:34CST2016 BeginRunTime:TueDec2723:01:34CST2016 EndRunTime:TueDec2723:01:39CST2016
晚于当前基准时间
Date=TueDec2722:28:00CST2016NowTime=TueDec2722:27:55CST2016 BeginRunTime:TueDec2722:28:00CST2016 EndRunTime:TueDec2722:28:05CST2016 BeginRunTime:TueDec2722:28:05CST2016 EndRunTime:TueDec2722:28:10CST2016 BeginRunTime:TueDec2722:28:10CST2016 EndRunTime:TueDec2722:28:15CST2016 Processfinishedwithexitcode0
延时的情况下,即使是早于基准时间,由于延时效应,根本不可能补偿完毕时间差内的执行任务,故而在延时的情况下,下一次任务的执行时间都是参考上一次任务结束的时间来计算。
对比总结
早于当前基准时间
晚于当前基准时间
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!