Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以安排任务“执行一次”或者定期“执行多次”。
然而在实际的开发过程当中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。
对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。
schedule(TimerTask task, Date time) // 安排在 "指定的时间" 执行 指定的任务。(只执行一次)
schedule(TimerTask task,long delay) // 安排在指定延迟后执行指定的任务
schedule(TimerTask task, Date firstTime , long period) // 安排指定的任务在 "指定的时间 " 开始进行 "重复" 的固定延迟执行
schedule(TimerTask task,long delay,long period)// 安排指定的任务指定的延迟后开始进行重复的固定延迟执行.
scheduleAtFixedRate(TimerTask task,Date firstTime,long period)// 安排指定的任务在指定的时间开始进行重复的固定速率执行.
scheduleAtFixedRate(TimerTask task,long delay,long period)//安排指定的任务在指定的延迟后开始进行重复的固定速率执行.
Timer.cancal()// 终止此计时器,丢弃所有当前已安排的任务。
Timer.purge()// 从此计时器的任务队列中移除所有已取消的任务。
TimerTask.cancal()// 把当前任务取消
固定延迟:意味着执行将在最后一次执行开始后的一段时间内开始,即使它被延迟(因此它本身被延迟)。也就是说任务的 下一次执行时间 是相对于 上一次实际执行完成的时间点 ,因此执行时间会不断延后
固定频率:意味着每次执行都将遵守初始计划,无论之前的执行是否被延迟。也就是说任务的 下一次执行时间 是相对于 上一次开始执行的时间点 ,因此执行时间不会延后
关于这两种调度方式,让我们看看如何使用它们:
为了使用固定延迟调度,schedule()方法还有两个重载,每个重载都使用一个额外的参数来表示以毫秒为单位的周期性。为什么两次重载?因为仍然有可能在某个时刻或某个延迟之后开始执行任务。
至于固定频率调度,我们有两个scheduleAtFixedRate()方法,它们的周期也是以毫秒为单位的。同样,我们有一种方法可以在给定的日期和时间启动任务,还有一种方法可以在给定的延迟后启动任务。
注意一点:如果一个任务的执行时间超过了执行周期,那么无论我们使用固定延迟还是固定速率,它都会延迟整个执行链。(固定速率会连续执行,固定延迟会等待延迟再执行)
/**
* @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());
}
}
/**
* @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);
}
}
/**
* @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,所以在任务结束时在开始下一次任务。

/**
* @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);
}
}

/**
* @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() 来生成的,而这个方法并不一定是任务真实执行的时间,而是当前任务应该执行的时间。
源码理解
我正在寻找一个用ruby演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent
如果您希望在Spring中启用定时任务功能,则需要在主类上添加 @EnableScheduling 注解。这样Spring才会扫描 @Scheduled 注解并执行定时任务。在大多数情况下,只需要在主类上添加 @EnableScheduling 注解即可,不需要在Service层或其他类中再次添加。以下是一个示例,演示如何在SpringBoot中启用定时任务功能:@SpringBootApplication@EnableSchedulingpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.ru
文章目录一、引言二、Timers1.System.Threading.Timer1.1.简单使用1.2.注意点2.System.Timers.Timer2.1.概述🔺2.2.注意点三、总结一、引言在开发中,会遇到并行处理的需求。有时只需要使用task(底层是创建个线程)来处理一下就好了。而有时则在并行处理的基础上还有时间的要求,较常见的就是每隔一定时间处理一次。当然,这用task肯定可以实现,但是时间这块得自己控制,无疑增加了工作量和不确定性。.NET提供了叫做定时器(timer,也叫计时器)的类,它在并行处理的基础上,带了时间参数的设置,可以满足这一需求。其实本文标题与其叫C#定时器,不如叫
我刚刚开始研究使用Amazon的SimpleDB服务作为我计划构建的RoR应用程序的数据存储的可行性。我们将为Web服务器使用EC2,并计划将EC2用于MySQL服务器。但现在的问题是,为什么不使用SimpleDB?应用程序(如果成功)需要在支持的用户数量方面具有很强的可扩展性,需要维护简单高效的代码库,并且需要可靠。我很好奇SO社区对此有何看法。 最佳答案 RubySimpleDB库不如ActiveRecord(默认的RailsDB适配器)那么完整,因此您习惯的许多功能将不存在。从好的方面来说,它是无模式的、可扩展的并且可以很好地
我在控制台服务应用中使用system.threading.timer,并尝试每天同时制作计时器。最初,如果我在时间之前启动该应用程序,我会很好。就像我的时间是10:05,我从10:00启动该应用程序,我们很好。但是,如果我从10:06开始,我就不知道如何告诉时间台下24小时。谢谢你的帮助!publicvoidSetUpTimer(TimeSpanalertTime){DateTimecurrent=DateTime.Now;TimeSpantimeToGo=alertTime-current.TimeOfDay;if(timeToGo{EventLog.WriteEntry("MhyApp",
加载网页后,我会通过控制台插入一些Javscript。我想知道我是否有可能使用Javascript或jQuery重新加载页面(而不是从缓存中),同时保持我正在运行的setInterval。我熟悉location.reload(),但这会终止它。 最佳答案 当您重新加载页面时,包括所有正在运行的JS在内的整个页面上下文将被完全破坏。重新加载其主机页面时,您不能保持setInterval()运行。您可以为新页面创建一个信号,以使用cookie、查询参数或本地存储值(查询参数可能是最合适的)再次开始间隔。如果采用这种方式,则需要对页面进行
我的ionic应用程序有一个计时器(一个简单的setInterval,每秒滴答一次),当应用程序位于前台时,它工作得很好。然而,当应用程序进入后台并在10分钟后返回前台时,应用程序中显示的时间是错误的(时间比应该的少得多)。我试过将计时器添加到指令中并使用nativeDOM操作api(document.getElementById等)方法,但它们都不起作用。我认为当应用程序进入后台时,ionic框架正在对View和绑定(bind)做一些事情。有没有人遇到过这样的问题?如果遇到过,你们是如何解决的? 最佳答案 经过几个小时的寻找答案,
如果这是重复的,我深表歉意。假设我有一个JavaScript函数调用网络服务来提取一些数据。我使用某种移动图形让用户知道它正在工作。成功检索后,我将图形更改为复选标记。这是我的代码:getData:function(){$("#button").attr("disabled","true");varparams={doRefresh:false,method:'/GetData',onSuccess:newthis.getDataCallback(this).callback,onFailure:newthis.getDataFailed(this).callback,args:{te
我将尝试使用AngularJS为特定的利基市场构建一个便士拍卖网站。我正在尝试计划倒数计时器,并且我一直渴望尝试使用firebase。我昨天有一个想法,让每次拍卖都以某种方式在实际数据库中有一个倒计时,因为有了2种方式的数据绑定(bind),人们的客户端将始终保持更新。当firebase发生变化时,所有连接的客户端都会立即发生变化。所以我的问题是……如何在特定记录中进行服务器端倒计时。假设我有一个项目x的记录,它包含所有项目信息,并且数组键之一是“倒计时:59:01:00”。在服务器端从59:01:00到00:00:00倒计时的现实且可扩展的方法是什么。我在想也许是每1秒运行一次的cr
持续关注阿杰在线更新保姆式笔记~~坚持日更目录一、通用定时器基本介绍二、基本定时功能1、定时器时钟来源分析2、常用库函数3、代码区三、定时器输出PWM3.1基本介绍3.2 PWM工作过程3.3 常用库函数 PWM输出配置步骤: 3.4 代码区四、输入捕获功能1.基本介绍2.工作过程3.常用库函数 输入捕获的一般配置步骤 代码区一、通用定时器基本介绍通用定时器包括TIM2、TIM3、TIM4和TIM5STM32通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。定时器可以进行定时器基本定时,输出4路PWM,输