老大让把以前的定时改成固定延迟的策略,即把以前固定的15分钟执行的任务改成没15分钟执行一次,但是如果上一次在15分钟没执行完毕,就等它执行完毕再执行(别管什么任务居然可以执行15分钟.......是个javamail收信的问题,可能会卡收信好几天...一直找不到好的方法).查了下API,Time.schedule(TimerTask task,
long delay, long period)好像可以做到,但是它的doc我貌似看不太明白,好吧,是这样的(我用的是
sun中文技术社区翻译的中文,我承认我英语没过4级):
安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。
在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定
Object.wait(long) 所依靠的系统时钟是准确的)。
固定延迟执行适用于那些需要“平稳”运行的重复活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。
参数:
task
- 所要安排的任务。
delay
- 执行任务前的延迟时间,单位是毫秒。
period
- 执行各后续任务之间的时间间隔,单位是毫秒。
抛出:
IllegalArgumentException
- 如果 delay 是负数,或者 delay + System.currentTimeMillis() 是负数。
IllegalStateException
- 如果已经安排或取消了任务,已经取消了计时器,或者计时器线程已终止。
在里面我没有看到我想要的:如果超过延迟了,是延迟后的时间加上执行间隔后执行还是立刻执行.
那就自己动手看看吧:
package com.hcycom.lan.test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class DelayTest extends TimerTask {
private Random d = new Random(System.currentTimeMillis());
private DateFormat df = new SimpleDateFormat("HH:mm:ss SSS");
@Override
public void run() {
System.out.println(df.format(new Date()));
try {
int i = d.nextInt(20000);
Thread.sleep(i);
System.out.println("sleep " + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Timer().schedule(new DelayTest(), 0, 10000);
}
}
以下是某次执行的结果:
16:19:34 203
sleep 10294
16:19:44 500
sleep 8147
16:19:54 515
sleep 6900
16:20:04 515
sleep 1135
16:20:14 515
sleep 19364
16:20:33 875
结果很明显:
当任务执行时间超过设定的间隔时,在本次任务执行完毕后,将立刻执行下次任务,不会理睬间隔的.
当任务执行时间小于设定的间隔时,将按照间隔去执行.
分享到:
相关推荐
以下是一些关于 Apache Camel Timer 组件的关键知识点: 1. **配置定时器**: - `timerName`:定义定时器的唯一标识。 - `period`:设置定时器触发事件的间隔时间,单位为毫秒。 - `delay`:设定首次触发事件...
Timer类主要提供了定时任务的安排执行,对于需要在指定时间后、或者以固定周期重复执行任务的场景非常有用。本文档中介绍的Timer类的实现以及如何使用Timer类去安排TimerTask任务,并讨论了一些相关的构造函数和方法...
而`schedule(TimerTask task, long delay, long period)`方法则会在初次延迟`delay`后,以固定的间隔`period`执行任务。请注意,这些方法中的`period`通常以毫秒为单位。 然而,`Timer`类的一个主要缺点是它并不...
若要周期性执行任务,可以使用`scheduleAtFixedRate()`方法,它会保证每次执行之间的间隔时间固定: ```java timer.scheduleAtFixedRate(new MyTask(), initialDelay, period); ``` 4. **取消与清理**: 当...
与Java的`java.util.Timer`不同,Spring Task Scheduler更灵活,支持cron表达式、固定延迟和固定间隔等定时策略。`ThreadPoolTaskScheduler`是其常见实现,它基于`ThreadPoolExecutor`。 3. **CronTrigger**: 在...
2. **定时策略**:支持定时执行(`schedule()`)和固定延迟执行(`scheduleWithFixedDelay()`)。 3. **取消任务**:可以取消正在执行的任务或停止整个线程池。 4. **更健壮**:`ScheduledExecutorService`在处理...
在 `Timer` 类中,主要方法有 `schedule(TimerTask task, long delay)` 用于在延迟指定毫秒数后执行任务,以及 `schedule(TimerTask task, Date firstTime, long period)` 用于定期执行任务。然而,如上所述,这些...
- `schedule(TimerTask task, long delay)`:这是一种固定延迟调度,每次任务执行的延迟会被传递到下一个任务。 - `scheduleAtFixedRate(TimerTask task, long initialDelay, long period)`:这是一种固定速率调度...
- `scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)`: 以固定延迟重复执行任务,上一次执行结束与下一次执行开始之间的时间间隔为固定值。 3. 示例代码: 使用Timer类...
- `timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)`:按照固定的速率执行任务,即使上一次执行超时,也不会影响下一次执行的间隔。 - `timer.purge()`:清除已取消的任务,提高定时器...
- JavaScript中的setTimeout和setInterval:setTimeout用于在指定延迟后执行一次回调,而setInterval则会在固定间隔重复执行回调。 - Java中的java.util.Timer和javax.swing.Timer:前者用于调度未来任务,后者主要...
4. `Timer.schedule(TimerTask task, long delay, long period)`: 延迟指定的毫秒数后开始,然后以固定的延迟间隔重复执行任务。 5. `Timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)`: 在...
`scheduleAtFixedRate`和`schedule`的区别在于处理延迟的策略。如果指定的开始时间早于当前时间,`scheduleAtFixedRate`会立即补偿过去的间隔,而`schedule`则不会。这意味着如果延迟时间已过,`scheduleAtFixedRate...
在实际应用中,你还可以根据需求调整任务的执行策略,如通过`TimerTask`的`cancel()`方法取消特定任务,或者在`Timer`的`cancel()`方法中终止所有计划的任务。同时,为了防止内存泄漏,确保在Web应用关闭时正确关闭...
此外,Java 5引入了`java.util.concurrent`包,其中的`ScheduledExecutorService`和`ScheduledFuture`接口提供了更强大的定时任务调度能力,包括支持取消、暂停和恢复任务,以及更灵活的定时策略。它们通常比`Timer`...
对于多线程环境,`ScheduledExecutorService`提供更强大的功能,如支持延迟执行和固定延迟执行。 2. **静态方法与非静态方法/变量的交互** 静态方法不能直接访问非静态成员,因为它们不属于任何特定的对象实例。若...
当API调用失败时,它可能采取重试策略,如设置最大重试次数、延迟重试间隔等。同时,异常处理机制也是必不可少的,通过try-catch语句捕获并处理可能出现的异常,保证程序的稳定运行。 五、配置与扩展性 Capn-Timer...
2. **fixedRate**:通过`@Scheduled(fixedRate = interval)`设置固定的间隔时间,单位为毫秒,例如`fixedRate = 300000`表示每5分钟执行一次。 3. **fixedDelay**:`@Scheduled(fixedDelay = interval)`设置的是上...
- `@Scheduled(fixedDelay = ..., initialDelay = ...)` 或 `@Scheduled(cron = "...")` 可以按固定延迟或cron表达式来设定任务执行。 4. 使用jar包运行定时任务: - 将Java程序打包成jar文件后,可以通过命令行...
在`Timer`类中,你可以使用`schedule(TimerTask task, long delay)`方法来安排一个任务在延迟指定毫秒后执行一次,或者使用`scheduleAtFixedRate(TimerTask task, Date firstTime, long period)`来周期性地执行任务...