百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Java并发学习之定时任务的几种玩法与小结

ccwgpt 2024-10-16 08:08 22 浏览 0 评论

Java中创建和玩转定时任务

定时任务,在日常工作中,可以说是一个算是一个常见的需求场景,比如定时数据校验,数据报表输出,报警等

0. 前言

前面一篇博文《Java并发学习之四种线程创建方式的实现与对比》, 有朋友指出线程池的方式应该算不上新的方式,而应该把Timer方式创建线程加上

这个却是我个人见识不够,写的时候没有想到Timer这种场景了,所以说分享学习记录,不仅仅可以帮助别人,自己也会因此收益

感谢@超大小龙虾 的指正,同时欢迎各位大侠对小弟多多指教

I. 定时任务创建的几种方式

这里给出几种个人接触过的定时任务使用方式(不全,仅供大家参考)

  1. 最简单的一种:在线程中执行Thread.sleep(),休眠挂起线程,等待一段时间后再执行

  2. 借助Timer和TimerTask实现定时任务

  3. 借助调度线程池Executors.newScheduledThreadPool()实现定时任务

  4. 借助第三方工具,如spring的定时任务; Quartz(听过没用过);以及其他一些开源工具或公司内的服务

下面简单介绍上面的几种思路,以及一般的使用姿势

1. Thread#sleep方式

严格来讲,这种不太能够算入定时任务的范畴,为什么这么说?

一般我们所说的定时任务可以区分为两种,一种是到了某个点自动执行;另一种就是每隔多长时间执行一次

而这种线程Sleep的方式,则是在运行后,强制使线程进入阻塞状态一段时间,然后再执行后续的逻辑,一般的使用流程是

这里把这个也放在定时任务里,可以看下面结合实例的case中的演示,利用这个sleep也可以非常猥琐的实现定时需求

2. Timer & TimerTask方式

TimerTask 是一个实现 Runnable的抽象类,因此可以将需要定时处理的业务逻辑封装在这个Task里面;然后通过Timer封装类来定时调度

TimerTask的使用姿势和一般的Runnable接口没啥两样

一般使用姿势如下

这个就有意思一点了,可以支持定时执行,也可以支持按一个频率执行,且一般使用可以将上面的步骤进行缩减, 直接这么玩

3.Executors#newScheduledThreadPool线程池方式

Executors提供了一批创建线程池的方式,除了常见的创建固定大小的线程池之外,还有个一就是创建ScheduledExecutorService来实现定时任务调度

借助Executors#newScheduledThreadPool来实现定时任务非常简单

从使用姿势来看,和Timer方式差不离,同样支持定时执行与每隔多长时间执行两种方式

4. spring的定时任务

spring方式就非常强大了,而且支持注解的配置方式,配置完毕,然后在方法上加一个注解,就可以实现定时执行了

常见的使用姿势

而且比较厉害的是,这个还支持cron表达式

II. 结合实例演示四种定时任务使用姿势

来两个实际的应用场景,用上面的四种方式分别实现

case:

系统中有一些统计数据,需要离线计算,每天凌晨计算完之后导入,然后需要一个定时任务,假设凌晨5点数据导入完毕;在5:15分进行校验,判断数据是否正常导入;校验完成之后,45分钟后即六点,将校验结果通知给owner

1. Thread#sleep 实现方式

采用sleep的方式实现定时任务,因为其本身不支持定时的情况,所以就只能比较猥琐的计算需要sleep的时间了

实现代码如下(非精确的实现方式,主要为了演示如何用sleep来实现上面这种场景)

简单说明下上面的实现思路:

  • 采用while(true)死循环,来实现每隔多长时间来执行一次

  • 对于定时触发任务的场景,需要计算指定时间与当前时间的差值,作为sleep的时间

这个实现方式,虽说可以完成目标,但是非常的不优雅,下面来看下Timer的实现方式

2. Timer&TimerTask 实现方式

使用Timer,需要借助TimerTask类,在其中书写定时任务的逻辑,因为case中有一个每隔一天跑一次的定时任务和一个延迟任务,所以这里用到了Timer的两种定时任务使用方式

相比与上一个,稍微好了那么一丢丢,至少从代码结构上来看简洁了很多

3. Executors.newScheduledThreadPool的实现方式

定时任务的方式,用起来和前面差不多,依然是两种方式的混搭

与Timer在用法上不同的一个是这里可以指定延迟的时间单位;但是希望在指定的时间进行执行时,依然还是得计算初始的延迟时间,和sleep使用方式中差不多

上面三中,是jdk本身就支持的定时任务的支持;总得来说,能实现你的需求场景,但是不好用,还得让自己去计算delayTime/sleepTime;讲道理,这对使用者而言,实在是不能更不友好了;

但是在另一方面,若延迟时间比较容易确认的话;或者单纯的使用每隔多长时间调度一次的话,Timer和ScheduledExecutorService两种方式都还不错

  • Timer 在指定时间执行任务相比较 ScheduledExecutorService 而言优雅一点

  • ScheduledExecutorService 则胜在使用起来简洁,而且schedule方法可以提交Callable任务,并获取返回值

  • Thread#sleep方法,则尽量不要这么玩,有点违和

4. 高逼格的Spring定时器

Spring 相比较jdk自带的几种方式而言,我认为,最完美的有两点

  • 支持cron表达式

  • 注解方式,无侵入

配置xml文件

实现业务逻辑

这个实现就简单了,相比较上面而言,添加一个注解,里面配置cron表达式,xml配置下,就可以实现定时任务

III. 小结

1. 本片博文主要介绍了实现定时任务的方式有几种,下面简单小结下四种方式的特点

方式说明特点
Thread#sleep线程挂起一段时间通过定时目标与当前时间计算sleepTime,来强制实现定时任务
Timer#TimerTask异步定时任务

TimerTask内部实现定时任务逻辑

  1. Timer可按频率调度任务

  2. Timer也支持指定时间调度任务

ScheduledExecutorService计划任务线程池
  1. 利用Executors#newScheduledThreadPool;创建线程池

  2. 创建线程任务实现定时任务逻辑

  3. 提交线程池执行,支持按频率调度,支持延迟多久调度

  4. 支持获取返回值

Spring Schedulespring提供的定时任务支持cron表达式,使用简单,非常简单,超级简单

2. 使用Timer方式,也可以算一种新的创建线程方式

3. 使用小建议

不推荐使用 Thread#sleep的方式做定时任务

如指向利用jdk实现定时任务,可以考虑Timer和ScheduledExecutorService

如项目本身就利用到了Spring,可以优先考虑这些优秀的框架提供的服务,用起来特别爽,谁用谁知道

IV. 其他

声明

尽信书则不如,已上内容,纯属一家之言,因本人能力一般,见识有限,如有问题,请不吝指正,感激

相关博文

  1. Java并发之 volatile & synchronized 讲解

  2. Java并发学习之Volatile及内存模型探究

  3. Java并发学习之synchronized原理及使用小结

  4. Java并发学习之ReentrantLock的工作原理及使用姿势

  5. Java并发学习之CountDownLatch实现原理及使用姿势

  6. Java并发学习之四种线程创建方式的实现与对比

  7. Java并发学习之线程状态及Thread常用方法详解

相关推荐

盲盒小程序背后的技术揭秘:如何打造个性化购物体验

在2025年的今天,盲盒小程序作为一种新兴的购物方式,正以其独特的魅力和个性化体验吸引着越来越多的消费者。这种将线上购物与盲盒概念相结合的应用,不仅为消费者带来了未知的惊喜,还通过一系列技术手段实现了...

小程序·云开发已支持单日亿级调用量,接口可用率高达99.99%

2019-10-1914:1210月19日,由腾讯云与微信小程序团队联合举办的“小程序·云开发”技术峰会在北京召开。会上,微信小程序团队相关负责人表示“小程序·云开发”系统架构已经支持每天亿级别的...

程序员副业开启模式:8个GitHub上可以赚钱的小程序

前言开源项目作者:JackonYang今天推荐的这个项目是「list-of-wechat-mini-program-list」,开源微信小程序列表的列表、有赚钱能力的小程序开源代码。这个项目分为两部分...

深度科普:盲盒小程序开发的底层逻辑

在当下的数字化浪潮中,盲盒小程序以其独特的趣味性和互动性,吸引着众多消费者的目光。无论是热衷于收集玩偶的年轻人,还是享受拆盒惊喜的上班族,都对盲盒小程序情有独钟。那么,这种备受欢迎的盲盒小程序,其开发...

微信小程序的制作步骤

SaaS小程序制作平台,作为数字化转型时代下的创新产物,不仅将易用性置于设计的核心位置,让非技术背景的用户也能轻松上手,快速制作出功能丰富、界面精美的小程序,更在性能和稳定性方面投入了大量精力,以确保...

携程开源--小程序构建工具,三分钟搞定

前言今天推荐的这个项目是「wean」,一个小程序构建打包工具。在wean之前,大量小程序工具使用webpack进行打包,各种loader、plugin导致整个开发链路变长。wean旨在解...

校园小程序的搭建以及营收模式校园外卖程序校园跑腿校园圈子系统

校园小程序的架构设计主要包括云端架构和本地架构两部分。云端架构方面,采用Serverless架构可以降低技术门槛,通过阿里云、腾讯云等平台提供的云服务,可以实现弹性扩容和快速部署。例如,使用云数据库、...

盲盒小程序开发揭秘:技术架构与实现原理全解析

在2025年的今天,盲盒小程序作为一种结合了线上购物与趣味性的创新应用,正受到越来越多用户的喜爱。其背后的技术架构与实现原理,对于想要了解或涉足这一领域的人来说,无疑充满了神秘与吸引力。本文将为大家科...

月活百万的小程序架构设计:流量暴增秘籍

从小程序到"大"程序的蜕变之路当你的小程序用户量从几千跃升至百万级别时,原有的架构就像一件不合身的衣服,处处紧绷。这个阶段最常遇到的噩梦就是服务器崩溃、接口超时、数据丢失。想象一下,在...

认知智能如何与产业结合?专家学者共探理论框架与落地实践

当前,以大模型为代表的生成式人工智能等前沿技术加速迭代,如何将认知智能与产业结合,成为摆在各行各业面前的一个问题。论坛现场。主办方供图7月4日,2024世界人工智能大会暨人工智能全球治理高级别会议在...

现代中医理论框架

...

认知行为(CBT)中的ABC情绪理论

情绪ABC理论是由美国心理学家阿尔伯特·艾利斯(AlbertEllis1913-2007)创建的理论,A表示诱发性事件(Activatingevent),B表示个体针对此诱发性事件产生的一些信...

说说卡伦霍妮的理论框架,对你调整性格和人际关系,价值很大

01自在今天我主要想说下霍妮的理论框架。主要说三本书,第一本是《我们时代的神经症人格》,第二本是《我们内心的冲突》,第三本是《神经症与人的成长》。根据我的经验,三本书价值巨大,但并不是每个人都能读进去...

供应链管理-理论框架

一个最佳价值的供应链,应该是一个具有敏捷性、适应性和联盟功能(3A)的供应链,其基本要素包括战略资源、物流管理、关系管理以及信息系统,目标是实现速度、质量、成本、柔性的竞争优势。篇幅有...

微信WeUI设计规范文件下载及使用方法

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信Web开发量身设计,可以令用户的使用感知...

取消回复欢迎 发表评论: