定时任务方案大百科(上)

简介: 节前有更新一篇定时任务的相关文章《延时消息之时间轮》,有朋友提出希望可以完整的介绍下常见的定时任务方案,于是便有了这篇文章。

Timer


本次会主要讨论大家使用较多的方案,首先第一个就是 Timer 定时器,它可以在指定时间后运行或周期性运行任务;使用方法也非常简单:



这样便可创建两个简单的定时任务,分别在 3s/5s 之后运行。


使用起来确实很简单,但也有不少毛病,想要搞清楚它所存在的问题首先就要理解其实现原理。


实现原理


定时任务要想做到按照我们给定的时间进行调度,那就得需要一个可以排序的容器来存放这些任务。


Timer 中内置了一个 TaskQueue 队列,用于存放所有的定时任务。



其实本质上是用数组来实现的一个最小堆,它可以让每次写入的定时任务都按照执行时间进行排序,保证在堆顶的任务执行时间是最小的。


这样在需要执行任务时,每次只需要取出堆顶的任务运行即可,所以它取出任务的效率很高为


结合代码会比较容易理解:



在写入任务的时候会将一些基本属性存放起来(任务的调度时间、周期、初始化任务状态等),最后就是要将任务写入这个内置队列中。



在任务写入过程中最核心的方法便是这个 fixUp() ,它会将写入的任务从队列的中部通过执行时间与前一个任务做比对,一直不断的向前比较。


如果这个时间是最早执行的,那最后将会被移动到堆顶。



通过这个过程可以看出 Timer 新增一个任务的时间复杂度为


再来看看它执行任务的过程,其实在初始化 Timer 的时候它就会在后台启动一个线程用于从 TaskQueue 队列中获取任务进行调度。



所以我们只需要看他的 run() 即可。



从这段代码中很明显可以看出这个线程是一直不断的在调用


task = queue.getMin();


来获取任务,最后使用 task.run() 来执行任务。



getMin() 方法中可以看出和我们之前说的一致,每次都是取出堆顶的任务执行。


一旦取出来的任务执行时间满足要求便可运行,同时需要将它从这个最小堆实现的队列中删除;也就是调用的 queue.removeMin() 方法。



其实它的核心原理和写入任务类似,只不过是把堆尾的任务提到堆顶,然后再依次比较将任务往后移,直到到达合适的位置。


从刚才的写入和删除任务的过程中其实也能看出,这个最小堆只是相对有序并不是绝对的有序。


源码看完了,自然也能得出它所存在的问题了。


  • 后台调度任务的线程只有一个,所以导致任务是阻塞运行的,一旦其中一个任务执行周期过长将会影响到其他任务。


  • Timer 本身没有捕获其他异常(只捕获了 InterruptedException),一旦任务出现异常(比如空指针)将导致后续任务不会被执行。


相关文章
|
6月前
|
存储 监控 安全
服务器常见问题以及处理方案
服务器常见问题以及处理方案
|
5月前
|
NoSQL 关系型数据库 分布式数据库
PolarDB产品使用问题之如何使用定时任务来指定时间进行扩容配置
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
存储 弹性计算 固态存储
阿里云服务器配置怎么选择合适?收藏级教程大家参考下
阿里云服务器配置选择涉及CPU、内存、带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型实例,如2核2G3M配置,适合低流量网站。企业用户应选择企业级独享型ECS,如通用算力型u1、计算型c7或通用型g7,至少2核4G配置,公网带宽建议5M,系统盘可选SSD或ESSD云盘。具体配置需根据实际应用需求来定。
248 0
|
弹性计算 负载均衡 安全
阿里云SLB简介和购买流程
阿里云SLB是阿里巴巴集团旗下的一个功能强大且高性能的负载均衡服务。在互联网的快速发展和技术创新的推动下,SLB成为了保证网站和应用程序可靠性、可扩展性和高可用性的重要组成部分之一。通过阿里云SLB,用户可以轻松地将流量分发到多个服务器,从而提高系统的整体性能和应用的可用性。这样每台服务器承受的压力都会减小很多
|
存储 监控 安全
阿里云存储简介和购买流程
阿里云存储是阿里巴巴集团旗下的一项云计算服务,为用户提供可靠、安全、弹性扩展的云存储解决方案。通过阿里云存储,用户可以高效地管理、存储和传输各类数据。 阿里云存储的核心功能包括对象存储、文件存储和块存储。对象存储是一种分布式存储模型,适用于存储海量非结构化数据,如图片、视频等。文件存储提供了类似于传统文件系统的共享存储服务,可方便地共享和访问文件。块存储则为云服务器提供了持久性的块级存储设备,可挂载到云服务器上使用。
|
存储 人工智能 机器人
如果有不限量云资源,先来做一个超级大模型
众所周知,人工智能发展的进度与存储能力成正比关系,也就是说存储能力决定了人工智能的发展程度。为什么这样讲?原因就是大数据、云计算都与大容量存储密切相关,尤其是现在井喷式的大数据发展,大体量的数据存储以及运算处理关于存储的要求是上不封顶的需求,就拿近几个月火爆全球的chatGPT的模型也是基于超大超强算力来实现的。
378 1
如果有不限量云资源,先来做一个超级大模型
|
安全 容灾 网络安全
阿里云主机简介和购买使用流程
阿里云是阿里巴巴旗下的云计算品牌,其主机产品作为阿里云的核心产品之一,受到了越来越多用户的青睐。通过阿里云主机,用户可以获得高性能、高安全、高可靠的计算资源,更好地满足自己的业务需求。本文将对阿里云主机进行全面介绍,包括主机类型、性能特点、购买流程等。
|
Java API 调度
Elastic-Job的快速入门,三分钟带你体验分布式定时任务
Elastic-Job的快速入门,三分钟带你体验分布式定时任务
Elastic-Job的快速入门,三分钟带你体验分布式定时任务
|
弹性计算 容灾 安全
阿里云服务器配置选择流程(2个入口)
阿里云服务器配置选择流程,2023阿里云服务器选购流程更新,选购云服务器有两个入口,一个是选择活动机,只需要选择云服务器地域、系统、带宽即可;另一个是在云服务器页面,自定义选择云服务器配置,这种方式购买云服务器较为复杂,需要选付费方式、地域及可用区、ECS实例规格、镜像、网络、公网IP、安全组等配置,阿里云百科来阿里云服务器购买流程指南2023新版教程:
|
存储 弹性计算 运维
Tair 的实操流程及常见问题 | 学习笔记
快速学习 Tair 的实操流程及常见问题
Tair 的实操流程及常见问题 | 学习笔记