📜  定时器java(1)

📅  最后修改于: 2023-12-03 14:53:36.040000             🧑  作者: Mango

定时器 Java

在 Java 中,我们可以使用定时器来创建重复的任务或者创建一个延时任务。定时器是一个非常有用的工具,可以在特定的时间间隔内执行下一个指定任务。

如何使用定时器

使用 Java 定时器需要引入 java.util.Timer 类。下面是一个使用定时器的示例代码:

import java.util.Timer;
import java.util.TimerTask;

public class MyTask extends TimerTask {
  public void run() {
    System.out.println("Task is performed on " + new Date());
  }
}

public class TimerExample {
  public static void main(String[] args) {
    Timer timer = new Timer();
    MyTask task = new MyTask();
    timer.schedule(task, 0, 1000);
  }
}

在上面的代码中,我们首先创建了一个 Timer 对象。接着,我们定义了一个 MyTask 类来扩展 TimerTask 类,并重写了它的 run() 方法。在 run() 方法中,我们输出了当前时间。

最后,在 main() 方法中,我们创建了一个 MyTask 对象 task,并调用了 Timer 对象的 schedule() 方法。schedule() 方法接受三个参数:要运行的任务、第一次运行任务的时间和任务之间的时间间隔。这里我们将任务的时间间隔设置为 1000 毫秒。

使用 ScheduledExecutorService 替代 Timer

虽然 Timer 可以在 Java 中执行延迟任务和重复任务,但是它的一些缺点也是显而易见的。比如说,Timer 是单线程的,如果某个任务的执行时间超过了预定的时间,那么可能会对后续任务的运行造成影响。此外,在 Timer 中抛出的异常会终止整个定时任务,而 ScheduledExecutorService 可以将异常限制在单个任务中。

因此,我们推荐使用 ScheduledExecutorService 来代替 Timer。这是一种在 Java 中执行延迟任务和重复任务的高级方法。ScheduledExecutorService 是线程安全的,并且支持延迟和周期性任务执行。

下面是一个使用 ScheduledExecutorService 的示例代码:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledExecutorServiceExample {
  public static void main(String[] args) {
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
    Runnable task = () -> System.out.println("Task is performed on " + new Date());
    executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
  }
}

在上面的代码中,我们首先创建了一个 ScheduledExecutorService 对象 executor。接着,我们定义了一个可以运行的任务,并将其设置为执行每 1 秒钟一次。其中的 scheduleAtFixedRate() 方法也接受三个参数:要运行的任务、第一次运行任务的时间和任务之间的时间间隔。

需要注意的是,在 ScheduledExecutorService 中,任务是通过线程池来执行的,每个任务都可以在独立的线程中运行。这意味着当某个任务的执行时间超过预定时间时,ScheduledExecutorService 不会影响其他任务的执行。

总结

使用定时器是 Java 程序员的一项非常有用的工具。无论是创建重复的任务还是创建延时任务,定时器都可以很好地帮助我们完成。在 Java 中,我们可以使用 Timer 类或者 ScheduledExecutorService 来实现定时器。虽然 Timer 有一些缺点,但对于简单的定时任务,它仍然是一个不错的选择。而 ScheduledExecutorService 则更加强大,也更适合一些复杂的任务。