●定时器是一种控制任务延时调用,或者周期调用的技术。
●作用:闹钟、定时邮件发送。
●方式一:Timer
●方式二: ScheduledExecutorService
构造器 | 说明 |
---|---|
public Timer() | 创建Timer定时器对象 |
方法名称 | 说明 |
---|---|
public void schedule(TimerTask task, long delay, long period) | 开启一个定时器,按照计划处理TimerTask任务 |
运行三秒后:
然后每间隔两秒执行一次
●Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入。
●可能因为其中的某个任务的异常使Timer线程死掉,从而影响后续任务执行。
错误展示①:Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入
举例:当一个线程执行两个任务时,若间隔时间相同,运行是正常的
●而当一个任务进行睡眠,执行时间过长时,另一个任务虽然间隔时间已经到了,但是线程还在为上一个任务服务,还未执行的任务无法按照既定的间隔时间执行,就出现了异常
●即某一个任务忙可能会对其他任务造成影响
错误展示②:可能因为其中的某个任务的异常使Timer线程死掉,从而影响后续任务执行。
某一个任务挂了,整个线程都挂了
●所以现在一般不用Timer定时器
●ScheduledExecutorService是 jdk1.5中引入了并发包,目的是为了弥补Timer的缺陷, ScheduledExecutorService内部为线程池。
Executors的方法 | 说明 |
---|---|
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) | 得到线程池对象 |
ScheduledExecutorService的方法 | 说明 |
---|---|
public ScheduledFuture> scheduleAtFixedRate(Runnable command, long initialDelay, long period,TimeUnit unit) | 周期调度方法 |
(1)使用ScheduledExecutorService定时器时,某一个任务忙不会对其他任务造成影响
(2)其中的某个任务的异常使Timer线程死掉,不会影响后续任务执行。
●基于线程池,某个任务的执行情况不会影响其他定时任务的执行。