实现问题描述
自定义线程,通过cron表达式,实现线程任务新增、删除、修改操作。
先说几个相关的对象:
executors:
线程池顶级接口,支持创建四种类型的线程池;
executorService:
线程池接口,继承于Executor;
scheduledExecutorService:
定时执行线程池,Executors支持创建的线程池中的一种;
taskScheduler:
任务调度器顶级接口,用于将线程执行为定时处理操作;
threadPoolScheduleTask:
任务调度器,继承于TaskScheduler;
scheduledFuture:
scheduledExecutorService定时任务执行的结果;其中cancel方法可以实现停止线程任务;
threadPoolTaskScheduler:
任务调度器(实现TaskScheduler),其中schedule方法,可以将一个线程按照指定时间规则进行运行,支持参数:runable和trigger;返回参数是:scheduledfuture,可以理解为按照指定格式进行运行的线程任务.
相关代码
自定义线程
public class PersonalRunable implements Runnable {
@Override
public void run() {
System.out.println("执行时间:"+ LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
将自定义线程实现增删改
@RestController
public class TestSchedule {
// 本案例中使用自定义的ThreadPoolTaskScheduler 进行线程任务调度
@Autowired
private ThreadPoolTaskScheduler personalThreadPoolTaskScheduler;
@Bean("personalThreadPoolTaskScheduler")
public ThreadPoolTaskScheduler getThreadPoolTaskScheduler(){
return new ThreadPoolTaskScheduler();
}
// 自定义容器以map形式存储当前运行的线程任务以及对应的线程执行结果
private final Map<CronTask,ScheduledFuture<?>> personalScheduleMap=new HashMap<>();
// 自定义线程注册器用于注册新的线程任务
private final ScheduledTaskRegistrar personalScheduleTaskRegistrar=new ScheduledTaskRegistrar();
// 根据cron表达式添加定时任务,使自定义线程按照指定的cron进行运行
@GetMapping("/add")
public String add(String cronExpression){
Runnable addRunnable = new PersonalRunable();
// 添加定时任务
CronTask addCronTask = new CronTask(addRunnable, cronExpression);
personalScheduleTaskRegistrar.addCronTask(addCronTask);
// 执行相关线程并添加到自定义容器中
ScheduledFuture<?> addScheduledFuture = personalThreadPoolTaskScheduler.
schedule(addRunnable, addCronTask.getTrigger());
personalScheduleMap.put(addCronTask,addScheduledFuture);
return "add";
}
// 删除正在运行的符合传递cron表达式的定时任务
@GetMapping("/del")
public String del(String cronExpression){
if(StringUtils.isEmpty(cronExpression)){
return "no cronExpression to del";
}
// 根据cron表达式称获取任务
for (CronTask cronTask : personalScheduleTaskRegistrar.getCronTaskList()) {
if(cronTask.getExpression().equals(cronExpression)){
// 从自定义容器中移除线程任务并停止任务
ScheduledFuture<?> scheduledFuture = personalScheduleMap.remove(cronTask);
scheduledFuture.cancel(true);
}
}
return "del";
}
// 将正在运行的cron表达式修改为新cron表达式进行运行
@GetMapping("/update")
public String start(String newCronExpression,String oldCronExpression){
PersonalRunable personalRunable = new PersonalRunable();
// 根据cron表达式称获取任务
for (CronTask cronTask : personalScheduleTaskRegistrar.getCronTaskList()) {
if(cronTask.getExpression().equals(oldCronExpression)){
// 从自定义容器中移除并先停止线程任务
ScheduledFuture<?> scheduledFuture = personalScheduleMap.remove(cronTask);
scheduledFuture.cancel(true);
// 后新增
CronTask newCronTask = new CronTask(personalRunable, newCronExpression);
personalThreadPoolTaskScheduler.schedule(personalRunable,newCronTask.getTrigger());
}
}
return "update";
}
}