在 Java 中调度重复固定延迟执行的任务


在固定延迟执行中,每次执行都是相对于前一次执行的原始执行时间进行调度的。如果由于某种原因(例如垃圾回收)导致执行延迟,则后续执行也将延迟。

可以通过两种方式调度重复固定延迟执行的任务:如下所示:

  • 在指定时间调度重复固定延迟执行的任务

  • 在指定延迟后调度重复固定延迟执行的任务

在指定时间调度重复固定延迟执行的任务

`void schedule(TimerTask task, Date firstTime, long period)` 方法用于调度重复固定延迟执行的任务,从指定时间开始。

**声明** − `java.util.Timer.schedule(TimerTask task, Date firstTime, long period)` 的声明如下:

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

这里,`task` 是要调度的任务,`firstTime` 是任务第一次执行的时间,`period` 是连续任务执行之间的时间间隔(毫秒)。

`schedule(Timertask task, Date firstTime, long period)` 方法会抛出一些异常,如下所示:

IllegalArgumentException如果 `firstTime.getTime()` 为负数或 `period` <= 0,则抛出此异常。
IllegalStateException如果任务已预先调度或取消,计时器已取消,或计时器线程已终止,则抛出此异常。
NullPointerException如果 `task` 为空,则抛出此异常。

让我们来看一个示例,演示如何在 Java 中调度任务以从指定时间开始重复固定延迟执行:

示例

 在线演示

import java.util.*;
class MyTask extends TimerTask {
   public void run() {
      System.out.println("Task is running");
   }
}
public class Example {
   public static void main(String[] args) {
      Timer timer = new Timer(); // creating timer
      TimerTask task = new MyTask(); // creating timer task
      timer.scheduleAtFixedRate(task,new Date(),2000);
      // scheduling the task at the specified time at fixed-delay
   }
}

输出

Task is running
Task is running
Task is running
Task is running
Task is running

在指定延迟后调度重复固定延迟执行的任务

`void schedule(TimerTask task, long delay, long period)` 方法用于调度重复固定延迟执行的任务,从指定的延迟后开始。

**声明** − `java.util.Timer.schedule(TimerTask task, long delay, long period)` 的声明如下:

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

这里,`task` 是要调度的任务,`delay` 是任务执行前的延迟时间(毫秒),`period` 是连续任务执行之间的时间间隔(毫秒)。

这里,`task` 是要调度的任务,`firstTime` 是任务第一次执行的时间,`period` 是连续任务执行之间的时间间隔(毫秒)。

`schedule(Timertask task, long delay, long period)` 方法会抛出一些异常,如下所示:

**IllegalArgumentException**如果 `firstTime.getTime()` 为负数或 `period` <= 0,则抛出此异常。
IllegalStateException如果任务已预先调度或取消,计时器已取消,或计时器线程已终止,则抛出此异常。
NullPointerException如果 `task` 为空,则抛出此异常。

让我们来看一个程序,演示如何使用 `void schedule(TimerTask task, long delay, long period)` 方法:

示例

 在线演示

import java.util.*;
class MyTask extends TimerTask {
   public void run() {
      System.out.println("Task is running");
   }
}
public class Example {
   public static void main(String[] args) {
      Timer timer = new Timer(); // creating timer
      TimerTask task = new MyTask(); // creating timer task
      // scheduling the task for repeated fixed-delay execution, beginning after the specified delay
      timer.schedule(task, 800, 1000);
   }
}

输出

Task is running
Task is running
Task is running
Task is running
Task is running
Task is running
Task is running
Task is running
Task is running
Task is running

更新于:2020年6月26日

954 次浏览

启动您的职业生涯

通过完成课程获得认证

开始学习
广告