Java定时器是Java多线程编程中的一个重要概念,它可以用来实现在一定时间间隔或者指定时间点执行某个任务,在Java中,有两种类型的定时器:一种是Timer类,另一种是ScheduledExecutorService接口,本文将详细介绍这两种定时器的使用方法和原理。

1、Timer类

Timer类是Java提供的一个继承自Thread类的定时器类,它可以用于执行一个或者多个任务,Timer类的主要方法有以下几个:

- schedule(TimerTask task, long delay):安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。

- schedule(TimerTask task, Date firstTime):安排指定的任务在指定的时间首次执行,然后按照固定的周期进行重复执行。

- schedule(TimerTask task, long delay, long period):安排指定的任务从指定的延迟后开始进行重复的固定周期执行。

- scheduleAtFixedRate(TimerTask task, Date firstTime, long period):安排指定的任务在指定的初始延迟后开始进行重复的固定速率执行。

- scheduleAtFixedRate(TimerTask task, long delay, long period):安排指定的任务从指定的延迟后开始进行重复的固定速率执行。

- cancel():取消由该计时器调度的任务。

- purge():清除所有已取消的任务。

下面是一个简单的使用Timer类的例子:

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerDemo {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new MyTimerTask();
        long delay = 1000; // 延迟1秒执行
        long period = 2000; // 每隔2秒执行一次
        timer.schedule(task, delay, period);
    }
}
class MyTimerTask extends TimerTask {
    @Override
    public void run() {
        System.out.println("任务执行:" + new Date());
    }
}

2、ScheduledExecutorService接口

ScheduledExecutorService接口是Java提供的一个用于管理线程池和调度任务的接口,它比Timer类更加灵活和强大,ScheduledExecutorService接口的主要方法有以下几个:

- schedule(Runnable command, long delay, TimeUnit unit):安排在给定延迟后运行命令,如果当前时间超过了延迟时间则立即运行。

- schedule(Callable<V> callable, long delay, TimeUnit unit):安排在给定延迟后执行给定的参数、返回值、异常处理程序和方法调用所需的所有其他参数的调用。

- scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit):安排在给定初始延迟后开始,然后在每次执行终止和下一次执行开始之间都存在给定的延迟。

- scheduleWithFixedDelay(Callable<V> callable, long initialDelay, long delay, TimeUnit unit):安排在给定初始延迟后开始,然后在每次执行终止和下一次执行开始之间都存在给定的延迟。

- scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit):安排在给定初始延迟后开始,然后在给定的周期内连续地定期执行命令。

- scheduleAtFixedRate(Callable<V> callable, long initialDelay, long period, TimeUnit unit):安排在给定初始延迟后开始,然后在给定的周期内连续地定期执行命令。

- shutdown():关闭此执行器服务,停止接收新任务。

- awaitTermination(long timeout, TimeUnit unit):等待当前正在执行的任务完成或超时。

- isShutdown():判断此执行器服务是否已关闭。

- isTerminated():判断此执行器服务是否已终止。

- submit(Callable<T> task):提交一个可调用任务以进行异步执行。

- execute(Runnable command):在与此执行器关联的线程上以单线程方式执行给定的任务,除非任务本身声明它是后台任务。

- invokeAll(Collection<? extends Callable<T>> tasks):尝试停止所有正在为此执行器服务的等待任务,暂停处理正在等待的任务,并返回等待任务列表。

- invokeAny(Collection<? extends Callable<T>> tasks):尝试停止所有正在为此执行器服务的等待任务,暂停处理正在等待的任务,并返回第一个完成的任务的结果。

- futureOrTimeout(long timeout, TimeUnit unit):获取与给定超时和时间单位关联的期限为future的方法结果,如果在给定的时间内没有可用的结果,则抛出TimeoutException异常。

- cancel(boolean mayInterruptIfRunning):尝试取消此执行器服务当前正在运行或排队的任务。

- list():获取此执行器服务的所有已提交任务的估计大小。

- peek():查看此执行器服务中是否有队列中的活动任务。

- poll():检索并移除此队列的头;如果此队列为空则返回null。

- remove():从此队列中移除指定元素的头部;如果此队列为空则返回null。

- contains(Object o):如果此队列包含指定的元素,则返回true。

- size():返回此队列的大小。

- clear():从此队列中移除所有元素。

- isEmpty():如果此队列为空则返回true。

- toArray():返回一个包含此队列中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

- retainAll(Collection<?> c):仅保留此队列中包含在指定集合中的元素。

- addAll(Collection<? extends E> c):将所有指定集合中的元素添加到此队列中。

- offer(E e):将指定的元素追加到此队列中。

- offer(E e, long timeout, TimeUnit unit):将指定的元素追加到此队列中,如果在指定的等待时间内无法添加元素,则返回false。

- take():从此队列中删除并返回第一个元素;如果此队列为空则阻塞,直到有元素可供消费为止。

- poll():检索并移除此队列的头;如果此队列为空则返回null。

- element():检索并移除此队列的第一个元素;如果此队列为空则抛出NoSuchElementException异常。

- peek():查看此队列中是否有元素可供消费;如果此队列为空则返回null。

- contains(Object o):如果此队列包含指定的元素,则返回true。

- iterator():返回在此队列上进行迭代的迭代器(按适当的顺序)。

- spliterator():返回一个Spliterator over the elements in this queue.(按适当顺序)

- toArray():返回一个包含此队列中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。