首页 > 编程知识 正文

linux手动实现定时任务,线程池实现定时任务

时间:2023-05-03 10:52:24 阅读:232969 作者:382

ScheduledExecutorService 实现定时任务 一、背景二、ScheduledExecutorService(java.util.concurrent并发包引进)附:代码1.Main.java2.TaskService.java3.application.yml
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@Componentpublic 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@Servicepublic class TaskService implements Runnable { @Override public void run() { // 定时任务业务逻辑 log.info("taskService run!!"); }} 3.application.yml #server:# port: 9116spring: main: web-application-type: nonetask: time_clear_sector: "18:00:00"

GitHub: link. 欢迎star

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。