大家好,又见面了,我是你们的朋友全栈君。
GitHub: link. 欢迎star
创建线程池,通过线程池的方式来执行任务。
第一次执行任务的延时时间(initialDelay),周期执行的时间间隔(period)。
@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);
}
}
@Slf4j
@Service
public class TaskService implements Runnable {
@Override
public void run() {
// 定时任务业务逻辑
log.info("taskService run!!");
}
}
#server:
# port: 9116
spring:
main:
web-application-type: none
task:
time_clear_sector: "18:00:00"
GitHub: link. 欢迎star
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137106.html原文链接:https://javaforall.cn