前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ScheduledExecutorService 实现定时任务「建议收藏」

ScheduledExecutorService 实现定时任务「建议收藏」

作者头像
全栈程序员站长
发布2022-09-05 11:08:18
1.1K0
发布2022-09-05 11:08:18
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

ScheduledExecutorService 实现定时任务

GitHub: link. 欢迎star

一、背景

  • 项目升级版本之后,新加了一些需求,其中有一个需要每天定时清理数据的业务逻辑。第一时间想到的实现方法是while循环里做sleep,想想好像有点low,就特此了解了一些Java实现定时任务的方式。大概有以下三种实现方式:
  1. JDK自带的定时器实现 :Timer类和JDK1.5+ 新增的定时任务接口ScheduledExecutorService。
  2. Quartz :Java编写的开源作业调度框架。
  3. Spring3.0以后自带的task :据了解可以将它看成一个轻量级的Quartz。

二、ScheduledExecutorService(java.util.concurrent并发包引进)

创建线程池,通过线程池的方式来执行任务。

第一次执行任务的延时时间(initialDelay),周期执行的时间间隔(period)。

  • scheduleAtFixedRate:延时设定时间(initialDelay)后执行第一次任务,每隔时间间隔(period)再次执行任务。
  • schedule:延时设定时间(initialDelay)后只执行一次任务。
  • scheduleWithFixedDelay:延时设定时间(initialDelay)后执行第一次任务,随后每次任务执行完后延迟设定时间(delay)再次执行任务。

附:代码

1.Main.java
代码语言:javascript
复制
@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
代码语言:javascript
复制
@Slf4j
@Service
public class TaskService implements Runnable { 
   

    @Override
    public void run() { 
   
        // 定时任务业务逻辑
        log.info("taskService run!!");
    }
}
3.application.yml
代码语言:javascript
复制
#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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ScheduledExecutorService 实现定时任务
  • 一、背景
  • 二、ScheduledExecutorService(java.util.concurrent并发包引进)
  • 附:代码
    • 1.Main.java
      • 2.TaskService.java
        • 3.application.yml
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档