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方法没有,它以现在的时间开始周期执行任务,之前要被循环执行的任务可能因为延迟没执行就算了

总结:要么在指定时间执行,要么在当前时间的多少秒后执行。如果有第三个参数,那么就是循环执行。
 

posted @ 2022-07-17 12:15  小大宇  阅读(13)  评论(0编辑  收藏  举报