Java多线程编程核心技术-----第五章读书笔记
5.1
原:Timer类的主要作用就是设置任务,TimerTask类用于封装任务。P241
Timer开启一个线程,可以通过构造器接收true将其作为守护线程。new Timer(true);
如果Timer timer = new Timer(); 则执行完任务仍然不关闭线程,
因为一个timer能开启多个任务task,在等待其它任务中······
TimerTask是一个实现了Runnable接口的抽象类,需要继承它并实现run()方法。
5.1.1
Timer的schedule(TimerTask task,Date date); 在指定时间执行指定任务
一般在设置时间的时候,可以把当前时间作为一个参考。
5.1.1.1
通常使用Calendar对象来设置未来某个时间,比如获取一个未来10S的Date对象
//获取日期对象,09:42:15
Calendar calendar = Calendar.getInstance();
//设置日期对象为09: 42: 20
calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND)+5);
Date runDate = calendar.getTime();
5.1.1.2
一般设置未来时间的方法,定位在未来5秒
calendar.add(Calendar.SECOND,5);
执行计划在过去的时间任务则立即执行。
5.1.1.3
Timer中允许有多个TimerTask任务,并且是按照顺序执行的。
任务如果前一个时间执行过长,很可能导致后面的任务延时执行。
总之,任务是一个接着一个执行,不能同时执行两个任务。
如果前一个任务出现阻塞,可能造成后面的任务都得不到执行,导致死锁。
5.1.2
Timer的schedule(TimeTask task , Date date , long period);
英文单词period是周期的意思
本方法的作用是,从指定的date时间,每过period时间周期后,执行一次task任务,无限循环下去。
5.1.2.4
原:TimerTask类的cancel()方法是将自身从任务队列中移除,其它任务不受影响。P250
TimerTask任务对象task对象,可以自己取消,防止周期执行。
在run()方法中调用 this.cancel();
5.1.2.5
Timer的cancel()方法是停止开启的线程,清除所有任务。进程销毁!
5.1.3
Timer的schedule(TimerTask task , long delay)
以当前时间为参考时间,延迟指定时间后执行。
5.1.4
Timer的schedule(TimerTask task , long delay , long period)
在当前时间的基础上,延迟多少时间后,每过period周期循环执行任务。
5.1.5
schedule 如果正常的话,那么执行完,隔了几秒在执行
如果不正常,上一次结束的时间已经超过了这次的计划时间,那么一旦上次任务结束,这次任务立马同步执行。
5.1.6
Timer的scheduleAtFixedRate(Timer task , Date date , long priod)
Timer的scheduleAtFixedRate(Timer task , long delay, long priod)
具有追赶性。如果计划时间在过去,那么从过去到现在这段时间间隔内的任务也会周期的执行。
比如计划时间在60秒之前,任务周期priod = 3秒。 那么要追加执行 60/3 = 20次 task任务。
schedule方法没有,它以现在的时间开始周期执行任务,之前要被循环执行的任务可能因为延迟没执行就算了。
总结:要么在指定时间执行,要么在当前时间的多少秒后执行。如果有第三个参数,那么就是循环执行。