ThreadPoolTaskScheduler 配置线程池
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
public class TaskSchedulerConfig {
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(20);
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);//任务完成再关闭线程池
threadPoolTaskScheduler.setAwaitTerminationSeconds(60);//设置任务等待时间,如果超过该值还没有销毁就强制销毁,确保最后关闭
return threadPoolTaskScheduler;
}
}
配置调度任务
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.time.ZoneId;
import java.util.concurrent.ScheduledFuture;
@Component
@Slf4j
public class ThreadTaskService {
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture scheduledFutureTow;
//scheduledFutureTow给一个get方法,用来得到此对象取消延迟任务
public ScheduledFuture getScheduledFutureTow() {
return scheduledFutureTow;
}
public void runtow(String name,String address,long microseconds) {
scheduledFutureTow = threadPoolTaskScheduler.schedule(new CustomTaskTow(name,address,microseconds),Instant.now().atZone(ZoneId.of("Asia/Shanghai")).toInstant().plusMillis(microseconds));
}
//内部类实现Runnable
private class CustomTaskTow implements Runnable {
private String name;
private String address;
private long microseconds;
// volatile boolean stop = false;
public CustomTaskTow(String name, String address,long microseconds) {
this.name = name;
this.address = address;
this.microseconds = microseconds;
}
@Override
public void run() {
// interruptTow();
System.out.println(name+"======"+address);
log.info("延迟了{}毫秒执行了",microseconds);
}
}
}
Controller层
@RequestMapping("/test4")//调度延迟任务
public void Rabtest(){
threadTaskService.runtow("小明","上海",6000);
System.out.println("调度延迟任务success");
}
@RequestMapping("/test5")//关闭任务
public void stopTest(){
ScheduledFuture scheduledFutureTow = threadTaskService.getScheduledFutureTow();
scheduledFutureTow.cancel(true);
System.out.println("取消延迟任务成功");
}
@RequestMapping("/test6")//调度延迟任务2
public void Rabtest2(){
threadTaskService.runtow("nihao","nihao",6000);
System.out.println("调度延迟任务成功success");
}
1. 正常执行一个任务
6秒后
2.业务要求下执行了一个延迟任务,但是在延迟时间内满足特定需求,需要取消未执行的任务。下面演示说明下:
执行一个延迟任务
在延迟执行的6秒内调用
这样就不会执行延迟任务了