大家好,又见面了,我是你们的朋友全栈君。
ScheduledExecutorService 实现定时任务
GitHub:
link. 欢迎star
一、背景
- 项目升级版本之后,新加了一些需求,其中有一个需要每天定时清理数据的业务逻辑。第一时间想到的实现方法是while循环里做sleep,想想好像有点low,就特此了解了一些Java实现定时任务的方式。大概有以下三种实现方式:
- JDK自带的定时器实现 :Timer类和JDK1.5+ 新增的定时任务接口ScheduledExecutorService。
- Quartz :Java编写的开源作业调度框架。
- Spring3.0以后自带的task :据了解可以将它看成一个轻量级的Quartz。
二、ScheduledExecutorService(java.util.concurrent并发包引进)
- 创建线程池,通过线程池的方式来执行任务。
// private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
- 第一次执行任务的延时时间(initialDelay),周期执行的时间间隔(period)。
- scheduleAtFixedRate:延时设定时间(initialDelay)后执行第一次任务,每隔时间间隔(period)再次执行任务。
- schedule:延时设定时间(initialDelay)后只执行一次任务。
- scheduleWithFixedDelay:延时设定时间(initialDelay)后执行第一次任务,随后每次任务执行完后延迟设定时间(delay)再次执行任务。
附:代码
1.Main.java
@Slf4j
@Component
public class Main implements ApplicationRunner {
public static final ThreadLocal<SimpleDateFormat> FORMAT = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
public static final ThreadLocal<SimpleDateFormat> FORMAT_DAY = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
private ScheduledExecutorService scheduledExecutorService; //定时任务线程池
@Value("${task.time_clear_sector}")
private String time_clear_sector; //任务执行时间
@Resource
private TaskService taskService; //定时任务
@PostConstruct
public void init() {
// 创建线程池
// scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService = Executors.newScheduledThreadPool(10);
}
@Override
public void run(ApplicationArguments args) {
for (int i = 0; i < 10; i++) {
System.out.println("Run!!");
}
long initialDelay = 12 * 60 * 60L; //定时任务延时启动
long period = 24 * 60 * 60L; //定时任务时间间隔
// 项目启动后,计算定时任务延时的启动时间
long currentTimeMillis = System.currentTimeMillis();
String taskTime = FORMAT_DAY.get().format(currentTimeMillis) + " " + time_clear_sector;
try {
long taskTimestamp = FORMAT.get().parse(taskTime).getTime();
initialDelay = (taskTimestamp - currentTimeMillis) > 0 ? (taskTimestamp - currentTimeMillis) / 1000 : 1;
} catch (ParseException e) {
e.printStackTrace();
}
// 定时任务启动(延时时间后周期执行)
scheduledExecutorService.scheduleAtFixedRate(taskService, initialDelay, period, TimeUnit.SECONDS);
}
}
2.TaskService.java
@Slf4j
@Service
public class TaskService implements Runnable {
@Override
public void run() {
// 定时任务业务逻辑
log.info("taskService run!!");
}
}
3.application.yml
#server:
# port: 9116
spring:
main:
web-application-type: none
task:
time_clear_sector: "18:00:00"
GitHub: link. 欢迎star
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137106.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...