今天讲解定时任务、延迟任务的线程池使用方式:
1、从 java 角度
2、从 Spring 框架角度
文章目录
- Java提供:ScheduledExecutorService接口(创建延迟任务线程池)
- ① 用法1:
- 1. 重写afterExecute方法
- 2. .schedule()方法调度任务
- ② 用法2:
- Spring提供:ThreadPoolTaskScheduler类
- 1、基于 Java 配置文件创建对象:
- 2. .schedule()方法调度任务(结合Cron)
Java提供:ScheduledExecutorService接口(创建延迟任务线程池)
这个接口继承 ExecutorService 接口。
① 用法1:
ScheduledThreadPoolExecutor 类 是 ScheduledExecutorService 接口的实现类,属于 java 并发包。它允许你设置一个固定数量的核心线程池,并调度任务在某个延迟时间后执行,或以固定的频率重复执行任务。
return new ScheduledThreadPoolExecutor(5, // 核心线程池大小new BasicThreadFactory.Builder() // 自定义线程工厂.namingPattern("schedule-pool-%d") // 线程的命名模式.daemon(true) // 线程设为守护线程.build(),new ThreadPoolExecutor.CallerRunsPolicy() // 任务拒绝策略
)
{@Overrideprotected void afterExecute(Runnable r, Throwable t) {//调用父类的方法super.afterExecute(r, t);ThreadUtil.printException(r, t);}
};
解析:
① new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()
:
-
创建一个
BasicThreadFactory
实例,用于创建线程。BasicThreadFactory 是 lang3 包下的工具类,使用时需要引入依赖。
-
namingPattern("schedule-pool-%d")
指定了线程的命名模式比如:这里就是
schedule-pool-1
,schedule-pool-2
等。 -
daemon(true)
表示这些线程是守护线程守护线程在所有非守护线程终止后会自动结束,适用于后台运行的任务。
-
build()
方法用于构建这个工厂实例。
1. 重写afterExecute方法
② 重写了 ThreadPoolExecutor
的 afterExecute(Runnable r, Throwable t)
方法,这个方法会在每个任务执行完毕后调用,提供了一个钩子来处理任务执行后的逻辑。这个方法默认实现为空方法,但可以在子类中重写该方法来自定义行为。
方法参数:
Runnable r
:当前执行的任务。Throwable t
:如果任务执行过程中抛出了异常,该参数会包含异常信息;如果任务正常完成,则该参数为null
。
该方法在任务 Runnable
完成 或 抛出异常之后执行,不论任务是正常执行完成还是由于异常中断,都会调用此方法。
2. .schedule()方法调度任务
对象实例.schedule(task, 10, TimeUnit.MILLISECONDS);
- 第一个参数:要执行的任务,它必须是实现了
Runnable
或Callable
的对象。这里传递了一个 task。(就是TimerTask
的对象,TimerTask
是Runnable
的子类) - 第二个参数:延迟时间,表示任务将在延迟 多少 毫秒后执行。
- 第三个参数:时间单位,指定时间延迟的单位为毫秒。
② 用法2:
// 也可以这样创建对象实例
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);scheduledExecutorService.scheduleAtFixedRate(()->{},100,10,TimeUnit.MILLISECONDS);
scheduleAtFixedRate
是周期性执行,schedule
是延迟执行,scheduleAtFixedRate
的参数为:
- 任务
- initialDelay 参数含义:初始延迟时间
- period 参数含义:执行任务的周期间隔
- 时间单位
Spring提供:ThreadPoolTaskScheduler类
1、ThreadPoolTaskScheduler是 Spring 框架 提供的一种用于调度任务的类,它是基于 Java 的 ScheduledThreadPoolExecutor 类 的封装,支持定时任务、延迟任务和周期性任务的执行。
2、ThreadPoolTaskScheduler 实现了 TaskScheduler 接口
1、基于 Java 配置文件创建对象:
@Configuration
public class Test {@Beanpublic ThreadPoolTaskScheduler test(){ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();// 设置线程池大小scheduler.setPoolSize(10);// 设置线程名称前缀scheduler.setThreadNamePrefix("MyTaskScheduler-");// 应用关闭时等待任务完成scheduler.setWaitForTasksToCompleteOnShutdown(true);// 等待任务完成的最大时间scheduler.setAwaitTerminationSeconds(30);return scheduler;}
}
2、核心属性:
属性 | 含义 |
---|---|
poolSize | 设置线程池的大小,默认为 1 |
threadNamePrefix | 设置线程名称前缀,便于调试和监控线程池的任务 |
waitForTasksToCompleteOnShutdown | 如果为 true ,则应用关闭时会等待所有已提交的任务完成 |
awaitTerminationSeconds | 设置应用关闭时等待任务完成的最大时间(单位:秒) |
removeOnCancelPolicy | (默认 false )在任务被取消后是否从任务队列中移除 |
2. .schedule()方法调度任务(结合Cron)
在之前基于 Java 的 ScheduledThreadPoolExecutor 内容中,我们知道了 schedule() 方法的使用情况。
但是: Spring 提供 ThreadPoolTaskScheduler 的 schedule() 方法,参数不一样,如下:
这里介绍如何结合 Cron 表达式使用:
String cron = .......;
.schedule(Runnable runnable, new CronTrigger(cron));
还可以对 Cron 表达式进行验证:
// 验证cron表达式
boolean a = CronExpression.isValidExpression(cron);
至此,文章结束,谢谢你的点赞和收藏!!!