java定时工具的辟谣

网络上关于java定时器的文章真的是错误百出,给我的学习造成了很大的困扰,Timer根本就没有线程安全问题,Timer的所有调度方法都和上次任务的结束时间没有关系,TImer和ScheduledThreadPoolExecutor当任务执行时间大于间隔时间的时候,该task不存在前一次执行还没结束,就再启动执行的情况。只有ScheduledThreadPoolExecutor对该task执行了多次schedulexxx方法、或者多个Timer schedule同一个task,会造成该task的并发。最后通过看源码做测试的方法整理了一些要点。

定时器Timer

Timer的作用是设置定时任务,但封装任务的类是TimerTask,需要程序员继承TimerTask这个抽象类,实现run()方法,放入自己的业务代码。


Timer的常用方法
  • Timer timer = new Timer()

构造TImer定时器,可以传入boolean参数,true将定时任务设置为守护线程,无参则不设置

  • 构建TimerTask实例

一般都是使用匿名类

TimerTask task = new TimerTask() {   
    public void run() {   
        ... //每次需要执行的业务代码
        cancel();//可以让该task退出调度
    }   
};
  • cancel取消全部定时任务

和TimerTask的cancel不同,将全部定时任务都取消

  • schedule调度定时任务

timer.schedule(task, time)

time为Date类型:在指定时间执行一次。

timer.schedule(task, delay)

delay 为long类型,不能小于0,从现在起过delay毫秒执行一次

timer.schedule(task, firstTime, period)

firstTime为Date类型,period为long,从firstTime时刻开始,每隔period毫秒执行一次

还有 86% 的精彩内容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容