当前位置: 首页 > news >正文

java基础学习:定时任务常见实现方式

一、Timer解析

TaskQueue:小顶堆,存放timeTask。

TimerThread:任务执行线程

  • 死循环不断检查是否有任务需要开始执行,有就执行它。
  • 始终是一个线程在执行。

单线程执行任务,任务有可能相互阻塞:

  • schedule:任务执行超时,会导致后面的任务往后推移,预想在这个间隔内存在的任务执行就没有了。
  • scheduleAtFixedRate:任务超时可能导致下一个任务就会马上执行。

运行时异常会导致timer线程终止。

任务调度是基于绝对时间的,对系统时间敏感。

二、定时任务线程池

ScheduledThreadPoolExecutor

  • 使用多线程执行任务,不会相互阻塞。
  • 如果线程失活,会新建线程执行任务:线程抛异常,任务会被丢弃、需要做捕获处理。
  • DelayedWorkQueue:小顶堆,无界队列:
    • 在定时线程池中,最大线程数是没有意义的。
    • 执行时间距离当前时间越接近的任务在队列的前面。
    • 用于添加ScheduleFutureTask(继承于FutureTask,实现RunnableScheduledFuture接口):提供异步执行能力,并且可以返回执行结果。
    • 线程池中的线程从DelayQueue中获取ScheduleFutureTask, 然后执行。
    • 实现了Delayed接口,可以通过getDelay方法来获取延迟时间。
    • Leader - Follower模式:避免没必要的唤醒和阻塞的操作,这样会更加有效,且节省资源。
    • 应用场景:适用于多个后台线程执行周期任务,同时为了满足资源管理的需求需要限制后台线程数。

SingleThreadScheduledExecutor

  • 单线程的ScheduledThreadPoolExecutor
  • 应用场景:适用于需要单个后台线程执行周期任务,同时需要保证任务顺序执行。

三、时间轮算法

http://www.lryc.cn/news/466538.html

相关文章:

  • 句柄是什么?有什么用?举例说明
  • Jenkins学习笔记
  • AI 解读软考高级操作系统顺序存取、直接存取、随机存取、相联存取的区别
  • STM32烧写准备
  • 为Windows Terminal 配置zsh + Oh-My-Zsh!
  • RNN、LSTM 与 Bi-LSTM
  • 第一性原理
  • DOM NamedNodeMap 接口详解
  • EasyExcel自定义下拉注解的三种实现方式
  • Burp Suite Professional 2024.9 for macOS x64 ARM64 - 领先的 Web 渗透测试软件
  • 使用Mock库进行依赖注入的实用指南
  • nosql课本习题
  • springboot 3.2.5集成spring security 只放行get请求,其他请求403
  • 【linux】麒麟v10安装ELKB(ARM架构)
  • 帝国CMS – AutoTitlePic 自动生成文章标题图片插件
  • Docker安装Mysql5.7,解决无法访问DockerHub问题
  • React中使用Antd开源组件Popover等部分组件原生样式改变问题
  • Linux 配置 ssh —— ubuntu
  • eCAP超声波测距-ePWM电机调速
  • 【K8s】Kubernetes 词汇表
  • 高级java每日一道面试题-2024年10月20日-数据库篇[Redis篇]-Redis为什么是单线程的?
  • SW-LIMS在化妆品行业稳定性试验中的应用
  • vue 项目i18n国际化,快速抽离中文,快速翻译
  • java--多态(详解)
  • windows DLL技术-DLL概述
  • C++ —— 实现一个日期类
  • Java全栈经典面试题剖析5】JavaSE高级 -- 集合
  • python中如何获取对象信息
  • 逐行讲解transformers中model.generate()源码
  • 小白对时序数据库的理解