Java计时器Timer中schedule方法和scheduleAtFixedRate方法的区别
概述
schedule关注执行间隔(大混子),scheduleAtFixedRate关注执行时间(守信的人)。
例子
schedule( task ,1000L ,2000L) 1秒后开始执行task线程,循环:每过2秒执行一次。
scheduleAtFixedRate( task ,1000L ,2000L) 1秒后开始执行task线程,循环:每过2秒执行一次。
public class LeaningThread { public static void main(String[] args) { SimpleDateFormat df = new SimpleDateFormat("mm:ss"); System.out.println("main程序开始执行,现在时间是:"+df.format(new Date())); Test task = new Test(); Timer tm = new Timer(); //第x秒开始执行,x+2,x+4,x+8,... tm.schedule(task,1000,2000);//1秒后开始执行task线程,循环:每过2秒执行一次。 //tm.scheduleAtFixedRate(task,1000,2000);//1秒后开始执行task线程,循环:每过2秒执行一次。 } }
令task线程前3次执行,分别需要3秒,从第4次开始,执行一次只需要一下下。
//继承抽象父类TimerTask class Test extends TimerTask{ static int number=3;//前3次执行的时候,线程睡3秒 static int count=0;//第几次执行 @Override public void run() { SimpleDateFormat df = new SimpleDateFormat("mm:ss"); System.out.println("线程第"+(++count)+"次执行"); System.out.println("线程开始执行,现在时间是:"+df.format(new Date())); //前三次睡三秒 if(0<number--){ try { System.out.println("线程执行三秒"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } }else { System.out.println("线程执行只需一瞬间"); } System.out.println("---------end-----------"); } }
schedule运行分析
程序执行的时间是第44秒,理论上它设计的执行时间为:45,47,49,51,53,55,57,......
但是第三次运行结结束(因为距离第三次运行早就过了2秒,第四次执行直接开始)已经是54秒,为了保证每隔两秒执行一次,它把第五次运行放在第56秒,以此类推,无视设计规则。
scheduleAtFixedRate运行分析
程序执行的时间是第37秒,理论上它设计的执行时间为:38,40,42,44,46,48,50.......
但是第三次结束(第四次直接开始运行)的时候已经47了,为了保证第六次执行在第48秒,它急速把之前落下来的第4次、第5次线程执行完了,并且在第48秒开始第6次执行。
(没有意外的话,它一定做到约定,就算出了意外,等意外过去了,它还是会想办法做到约定,真的,好守信!!!!我哭死)
总结:
schedule关注执行间隔(大混子),不关注计划(规则)。
scheduleAtFixedRate关注执行时间(守信的人),关注计划(规则)。
分类:
Java笔记 / Java基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南