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

ScheduledExecutorService 实现定时任务「建议收藏」ScheduledExecutorService实现定时任务一、背景二、ScheduledExecutorService(java.util.concurrent并发包引进)附:代码1.Main.java2.TaskService.java3.application.ymlGitHub:link. 欢迎star一、背景项目升级版本之后,新加了一些需求,其中有一个需要每天定时清理数据的业务逻辑。第一时间想到的实现方法是while循环里做sleep,想想好像有点low,就特此了解了一些Java实现定

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


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并发包引进)

  1. 创建线程池,通过线程池的方式来执行任务。
    // private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
    private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
    
  2. 第一次执行任务的延时时间(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账号...

(0)


相关推荐

  • Lunix_UNIX/LINUX

    Lunix_UNIX/LINUXlinux关机和重启命令(转)Lunix/Unix1.shutdownshutdown命令用于安全关闭Linux系统。shutdown命令的部分参数如下:[-t]指定在多长时间之后关闭系统[-r]重启系统[-k]并不真正关机,只是给每个登录用户发送警告信号[-h]关闭系统(halt)shutdown命令的工作实质是给ini…

  • Latex 参考文献格式

    Latex 参考文献格式在Latex中,一般使用.bib文件,维护一个参考文献库,对于中英文要求文后的参考文献显示格式不同,我们仅需要修改.tex文件中的引用格式即可。一.对于中文文章,参考文献格式一般要求按照下面的格式进行排版显示格式一般为(举个例子):在Latex中,我们仅需要修改两处:1.在\begin{document}前面加上\usepackage[numbers]{gbt7714}2.在后面参考文献处写上:{\small \bibliographystyle{gbt7714-nume

  • springBoot讲解,jpa使用,微服务架构,什么是RESTful API?

    springBoot讲解,jpa使用,微服务架构,什么是RESTful API?springBoot讲解,jpa使用,微服务架构,什么是RESTful API?

  • java多线程基本概述(九)——Lock(3)

    java多线程基本概述(九)——Lock(3)

  • 硬件SPI控制ST7789V「建议收藏」

    文章目录前言一、能用的方法有那些?1.利用硬件UART模拟SPI,实现9位数据发送2.搭建一个数字逻辑电路,人为实现9位spi发送3.发送两组8位SPI二、具体操作1.具体实现总结前言这段时间闲着没事,决定自己做个手表玩玩,参考了一些开源项目和数据手册,决定主控使用STM32F411CEU6,屏幕选用了淘宝一家商家的ST7789V主控的240*240分辨率的圆形tft屏幕。利用商家给的软件spi例程成功将屏幕点亮之后,尝试使用改为硬件spi的方式,加快屏幕的刷新速度但是尝试了多种方案后始终无法点亮,

  • ElasticSearch教程_Elasticsearch原理

    ElasticSearch教程_Elasticsearch原理Elasticsearch是一个分布式的RESTful风格的搜索和数据分析引擎。查询:Elasticsearch允许执行和合并多种类型的搜索—结构化、非结构化、地理位置、度量指标—

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号