java异步编程实战pdf(java实战项目推荐)
JAVA定时任务主要有两种,是Timer和ScheduledThreadPoolExecutor
Timer基于绝对时间,对系统时间敏感,ScheduledThreadPoolExecutor基于相对时间。定时器内部是单线程,而ScheduledThreadPoolExecutor内部是线程池,因此可以支持多个任务并发执行。
Timer常用API
ScheduledThreadPoolExecutor常用API
主要说说这两种怎么用。
Timer举例
shedule方法的执行结果如下,后续线程会一直延迟。
2018年10月8日星期一21:12:30科技委计时器开始计时.
2018年10月8日星期一21:12:35 CST时间到了!
2018年10月8日星期一21:12:39 CST时间到了!
如果使用scheduleAtFixedRate,如果执行延迟小于1s,将多执行几次,以弥补由于延迟而未达到的次数。
ScheduledThreadPoolExecutor举例
实施结果如下:
2018年10月8日星期一21:22:27科技委时间,时间:1064
2018年10月8日星期一21:22:31科技委时间,时间:5066
2018年10月8日星期一21:22:35科技委时间,时间:9066
同样,scheduleWithFixedDelay的执行原理与Timer的shedule方法相同。
Timer和 ScheduledThreadPoolExecutor选择
定时器的缺陷:1.单线程2.qcdbmh如果一个任务出现异常,后续所有任务都不会再次执行。
建议在生产环境中使用ScheduledThreadPoolExecutor。当然,使用spring框架的计时任务更简单,原生Java计时可以帮助我们加深分析底层问题的能力。
如果您有任何建议或错误,请留言讨论。