位置: IT常识 - 正文
推荐整理分享Java Timer(定时器)(java定时器怎么用),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:java定时器怎么用,java 定时器schedule,java定时器时间格式,java定时器时间格式,java 定时器时间表达式,java定时器时间格式,java定时器的使用,java 定时器时间表达式,内容如对您有帮助,希望把文章链接给更多的朋友!
固定延迟:意味着执行将在最后一次执行开始后的一段时间内开始,即使它被延迟(因此它本身被延迟)。也就是说任务的 下一次执行时间 是相对于 上一次实际执行完成的时间点 ,因此执行时间会不断延后
固定频率:意味着每次执行都将遵守初始计划,无论之前的执行是否被延迟。也就是说任务的 下一次执行时间 是相对于 上一次开始执行的时间点 ,因此执行时间不会延后
关于这两种调度方式,让我们看看如何使用它们:
为了使用固定延迟调度,schedule()方法还有两个重载,每个重载都使用一个额外的参数来表示以毫秒为单位的周期性。为什么两次重载?因为仍然有可能在某个时刻或某个延迟之后开始执行任务。
至于固定频率调度,我们有两个scheduleAtFixedRate()方法,它们的周期也是以毫秒为单位的。同样,我们有一种方法可以在给定的日期和时间启动任务,还有一种方法可以在给定的延迟后启动任务。
注意一点:如果一个任务的执行时间超过了执行周期,那么无论我们使用固定延迟还是固定速率,它都会延迟整个执行链。(固定速率会连续执行,固定延迟会等待延迟再执行)
具体代码schedule(TimerTask task, Date time)/** * @PROJECT_NAME: demo * @DESCRIPTION: 指定时间执行 */public class TimerDemo { public static void main(String[] args) { Calendar ca = Calendar.getInstance(); System.out.println(ca.getTime()); ca.set(Calendar.SECOND, ca.get(Calendar.SECOND) + 5); new Timer().schedule(new TimerTask() { @Override public void run() { System.out.println(new Date(scheduledExecutionTime()); } }, ca.getTime()); }}schedule(TimerTask task,long delay)/** * @PROJECT_NAME: demo * @DESCRIPTION: 延迟指定时间后执行 */public class DelayDemo { public static void main(String[] args) { System.out.println(new Date()); new Timer().schedule(new TimerTask() { @Override public void run() { System.out.println(new Date(scheduledExecutionTime()); } }, 2000); }}schedule(TimerTask task, Date firstTime, long period)/** * @PROJECT_NAME: demo * @DESCRIPTION: 安排指定的任务在 "指定的时间 " 开始进行 "重复" 的固定延迟执行 */public class FirstAndPeriodDemo { public static void main(String[] args) { Calendar ca = Calendar.getInstance(); System.out.println(ca.getTime()); ca.set(Calendar.SECOND, ca.get(Calendar.SECOND) + 2); new Timer().schedule(new TimerTask() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(new Date(scheduledExecutionTime())); } }, ca.getTime(),2000); }}第一次任务延迟了2s,然后之后因为实现线程执行时间为3s,所以在任务结束时在开始下一次任务。
schedule(TimerTask task,long delay,long period)/** * @PROJECT_NAME: demo * @DESCRIPTION: 安排指定的任务在“指定的延迟”后开始进行“重复”的固定延迟执行 */public class DelayAndPeriodDemo { public static void main(String[] args) { System.out.println(new Date()); new Timer().schedule(new TimerTask() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(new Date(scheduledExecutionTime())); } }, 1000,2000); }}scheduleAtFixedRate(TimerTask task,Date firstTime,long period)/** * @PROJECT_NAME: demo * @DESCRIPTION: */public class FixAndFirstDemo { public static void main(String[] args) { System.out.println(new Date()); new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(new Date(scheduledExecutionTime())); } }, 1000, 2000); }}按照固定速率执行。 但是,这儿引出了另外一个问题。既然 Timer 内部是单线程实现的,在执行间隔为2秒、任务实际执行为3秒的情况下, scheduleAtFixedRate 是如何做到2秒输出一次的呢?
【特别注意】
这儿其实是一个障眼法。需要重点关注的是,打印方法输出的值是通过调用 scheduledExecutionTime() 来生成的,而这个方法并不一定是任务真实执行的时间,而是当前任务应该执行的时间。 源码理解
上一篇:前端搭建小人逃脱游戏(内附源码)
下一篇:微信小程序支付完整流程(前端)(微信小程序支付接口调用)
友情链接: 武汉网站建设