面试突击34(如何使用线程池执行定时任务())

在 Java 语言中,有两个线程池可以执行定时任务:ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadScheduledExecutor 可以看做是 ScheduledThreadPool 的单线程版本,它的用法和 ScheduledThreadPool 是一样的,所以本文重点来看 ScheduledThreadPool 线程池的使用。
ScheduledThreadPool 执行定时任务的方法有以下 3 个:

  1. 使用 schedule 方法执行定时任务,只执行一次定时任务。
  2. 使用 scheduleAtFixedRate 方法执行定时任务,执行多次定时任务。
  3. 使用 scheduleWithFixedDelay 方法执行定时任务,执行多次定时任务。
接下来我们看这 3 个方法的具体使用和区别。
1.schedule schedule 方法只能执行一次定时任务,它需要传递 3 个参数:
  • 第 1 个参数:传递一个任务,Runnable 或 Callable 对象;
  • 第 2 个参数:添加定时任务后,再过多久开始执行定时任务;
  • 第 3 个参数:时间单位,配合参数 2 一起使用。
下面我们创建一个 3 秒以后执行的定时任务:
import java.time.LocalDateTime; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledThreadPoolExample { public static void main(String[] args) throws InterruptedException { // 创建 ScheduledThreadPool 线程池 ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10); System.out.println("schedule 方法添加任务:" + LocalDateTime.now()); threadPool.schedule(new Runnable() { @Override public void run() { System.out.println("执行 schedule 方法:" + LocalDateTime.now()); } }, 3, TimeUnit.SECONDS); // 3s 之后执行// 以下代码是给业务方法一个时间对照信息 TimeUnit.SECONDS.sleep(10); // 休眠 10s System.out.println("当前时间:" + LocalDateTime.now()); } }

以上程序的执行结果如下图所示:
面试突击34(如何使用线程池执行定时任务())
以上程序的执行结果如下图所示:
面试突击34(如何使用线程池执行定时任务())
以上程序的执行结果如下图所示:
面试突击34(如何使用线程池执行定时任务())

    推荐阅读