java 定时器
Timer定时器是单线程执行
定时器实现的流程:
(1)第一步:创建一个Timer。
(2)第二步:创建一个TimerTask。
(3)第三步:使用Timer执行TimerTask。
执行:
(1)schedule(task,time) 在时间等于或超过time的时候执行且只执行一次task,这个time表示的是例如2019年11月11日上午11点11分11秒。指的是时刻。
(2)schedule(task,time,period)
在时间等于或超过time的时候首次执行task,之后每隔period毫秒重复执行一次task 。这个time和上一个一样。
(3)schedule(task, delay)
在delay时间之后,执行且只执行一次task。这个delay表示的是延迟时间,比如说三秒后执行。
(4)schedule(task,delay,period)
在delay时间之后,开始首次执行task,之后每隔period毫秒重复执行一次task ,这个delay和上面的一样。
(5)scheduleAtFixedRate(task, time, period)
在时间等于或超过time的时候首次执行task,之后每隔period毫秒重复执行一次task 。这个time表示的是例如2019年11月11日上午11点11分11秒。指的是时刻。
(6)scheduleAtFixedRate(task, delay, period)
在delay时间之后,开始首次执行task,之后每隔period毫秒重复执行一次task ,这个delay表示的是延迟时间,比如说三秒后执行。
schedule和scheduleAtFixedRate的区别:
schedule:如果第一次执行时间被delay了,随后的执行时间按照上一次实际执行完的时间点进行计算 。scheduleAtFixedRate:如果第一次执行时间被delay了,随后的执行时间按上一次开始的时间进行计算,并且为了赶上进度会多次执行任务。
Timer存在的缺陷:
Timer是单线程执行,当有一个任务出现error的时候,所有的都停止执行。
推荐使用ScheduledExecutorService框架的定时器。
2. 采用@Scheduled(cron = "")注解来设置定时器