• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

java-并发-Timer和TimerTask

java 搞代码 4年前 (2022-01-09) 20次浏览 已收录 0个评论

Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现

[code]Timer timer = new Timer();timer.schedule(new TimerTask() {        public void run() {            System.out.println("abc");        }}, 200000 , 1000);

public void schedule(TimerTask task, long delay)

  这个方法是调度一个task,经过delay(ms)后开始进行调度,仅仅调度一次。

public void schedule(TimerTask task, Date time)

  在指定的时间点time上调度一次。

public void schedule(TimerTask task, long delay, long period)

  这个方法是调度一个task,在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调度。

public void schedule(TimerTask task, Date firstTime, long period)

  和上一个方法类似,唯一的区别就是传入的第二个参数为第一次调度的时间。

public void scheduleAtFixedRate(TimerTask task, long delay, long period)

度一个task,在delay(ms)后开始调度,然后每经过period(ms)再次调度,貌似和方法:schedule是一样的,其实不然,后面你会根据源码看到,schedule在计算下一次执行的时间的时候,是通过当前时间(在任务执行前得到) + 时间片,而scheduleAtFixedRate方法是通过当前需要执行的时间(也就是计算出现在应该执行的时间)+ 时间片,前者是运行的实际时间,而后者是理论时间点,例如:schedule时间片是5s,那么理论上会在5、10、15、20这些时间片被调度,但是如果由于某些CPU征用导致未被调度,假如等到第8s才被第一次调度,那么schedule方法计算出来的下一次时间应该是第13s而不是第10s,这样有可能下次就越到20s后而被少调度一次或多次,而scheduleAtFixedRate方法就是每次理论计算出下一次需要调度的时间用以排序,若第8s被调度,那么计算出应该是第10s,所以它距离当前时间是2s,那么再调度队列排序中,会被优先调度,那么就尽量减少漏掉调度的情况。

[code]public Timer() {    this("Timer-" + serialNumber());}

创建的线程不为主线程,则主线程结束后,ti本文来源gaodai$ma#com搞$$代**码)网8mer自动结束,而无需使用cancel来完成对timer的结束。

[code]public Timer(boolean isDaemon) {    this("Timer-" + serialNumber(), isDaemon);}

传入了是否为后台线程,后台线程当且仅当进程结束时,自动注销掉。

[code]public Timer(String name, boolean isDaemon) {      thread.setName(name);      thread.setDaemon(isDaemon);      thread.start();  }

这里有一个thread,这个thread很明显是一个线程,被包装在了Timer类中,我们看下这个thread的定义Timer内部包装了一个线程,用来做独立于外部线程的调度,而TimerThread是一个default类型的,默认情况下是引用不到的,是被Timer自己所使用的。

private TaskQueue queue = new TaskQueue();

threadReaper,它是Object类型,只是重写了finalize方法而已,是为了垃圾回收的时候,将相应的信息回收掉,做GC的回补,也就是当timer线程由于某种原因死掉了,而未被cancel,里面的队列中的信息需要清空掉,不过我们通常是不会考虑这个方法的,所以知道java写这个方法是干什么的就行了。

调度方法


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:java-并发-Timer和TimerTask

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址