ScheduledExecutorService的使用

来源:互联网 发布:java读取文件为字符串 编辑:程序博客网 时间:2024/06/01 08:03

ScheduledExecutorService


在使用SchduledExecutorService之前,我们更常用的是Timer 结合TimerTask进行类似定时任务的操作,但是每次在使用没接触过的东西时,总是会先去网上查证一下,以确认找到更好的直接使用,下面也先copy下前人分享的经验吧。

java.util.Timer计时器有管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务")。
但是,Timer存在一些缺陷,因此你应该考虑使用ScheduledThreadPoolExecutor作为代替品,Timer对调度的支持是基于绝对时间,而不是相对时间的,
由此任务对系统时钟的改变是敏感的;ScheduledThreadExecutor只支持相对时间。

Timer的另一个问题在于,如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。
Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。
这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。
此时,已经被安排但尚未执行的TimerTask永远不会再执行了,新的任务也不能被调度了。
 
个人总结:timer的bug:60秒执行一次的话,如果用户修改了时间的话 那么时针都会归0,本来是临近10秒执行的时候timer又会重新计时一次 再等60才执行。

 实例请参照:

http://www.cnblogs.com/androidez/archive/2013/03/12/2955842.html

SchduledExecutorService一般用法就是
1,先从,Executors对象点出一个自己需要的线程实例,Executors有以下诸多获取方式,如图

然后得到一个SchduledExecutorService 

2,然后用得到的SchduledExecutorService执行类似Timer.schedule进行轮询操作,
结合Handler进行消息传递,实现想要的轮播等相关操作,类似操作,如图:

大致操作就是这么简单,实践永远是检验对错的唯一途径
0 0
原创粉丝点击