延迟任务基于DeyalQueue
一,延迟任务应用场景?
一般用于处理订单,将redis中的数据延迟存入数据库,实现异步存储减少DB的压力
二, 延迟任务的实现方案有很多
DelayQueue
Redisson
MQ
时间轮
原理
JDK自带延迟队列,基于阻塞队列实现。
基于Redis数据结构模拟JDK的DelayQueue实现
利用MQ的特性。例如RabbitMQ的死信队列
时间轮算法
优点
不依赖第三方服务
分布式系统下可用
不占用JVM内存
分布式系统下可以
不占用JVM内存
不依赖第三方服务
性能优异
缺点
占用JVM内存
只能单机使用
依赖第三方服务
依赖第三方服务
只能单机使用
三,延迟任务的原理
1,DelayQueue的源码
public class DelayQueue<E extends Delayed> extends AbstractQueue<E>implements BlockingQueue<E> {private final transient ReentrantLock lock = new ReentrantLock();private final PriorityQueue<E> q = new PriorityQueue<E>();// ... 略
}
- DelayQueue实现了BlockingQueue接口,是一个阻塞队列。队列就是容器,用来存储东西的.
DelayQueue的泛型定义
<E extends Delayed>
这说明存入
DelayQueue内部的元素必须是Delayed类型
进一步查看Delay接口
public interface Delayed extends Comparable<Delayed> {/*** Returns the remaining delay associated with this object, in the* given time unit.** @param unit the time unit* @return the remaining delay; zero or negative values indicate* that the delay has already elapsed*/long getDelay(TimeUnit unit);
}
看完之后我们先不管 ,继续看他的父类Comparable<Delayed>
里面有一个方法,用于比较大小

2,从源码中可以看出,Delayed类型必须具备两个方法:
getDelay():获取延迟任务的剩余延迟时间
compareTo(T t):比较两个延迟任务的延迟时间,判断执行顺序
根据源码中的注解可以看出
zero or negative values indicate * that the delay has already elapsed
零或者负值表示延迟已经过去
四,DelayQueue的用法
1,定义一个延迟任务的工具类
package com.tianji.learning.utils;import lombok.Data;import java.time.Duration;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;@Data
public class DelayTask<D> implements Delayed {private D data; //用于存放延迟任务的数据private long deadlineNanos; //延迟任务延迟到什么时候/*** delayTime 延迟多长时间*/public DelayTask(D data, Duration delayTime) {this.data = data;//用当前时间和需要延迟的时间相加得到的结果就是延迟任务延迟结束的时间this.deadlineNanos = System.nanoTime() + delayTime.toNanos();}/*** 这个方法是用于获取延迟任务的剩余时间*/@Overridepublic long getDelay(TimeUnit unit) {return unit.convert(Math.max(0, deadlineNanos - System.nanoTime()), TimeUnit.NANOSECONDS);}//将队列中的延迟任务的剩余时间进行比较,然后进行排队@Overridepublic int compareTo(Delayed o) {long l = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);if(l > 0){return 1;}else if(l < 0){return -1;}else {return 0;}}
}
2,使用延迟队列
// 1.初始化延迟队列
DelayQueue<DelayTask<String>> queue = new DelayQueue<>();
// 2.向队列中添加延迟执行的任务 //当前延迟时间是Second
queue.add(new DelayTask<>("延迟任务数据,可以是方法", Duration.ofSeconds(延迟时间)));
// 3.尝试执行任务
DelayTask<String> task = queue.take();
//执行延迟队列中的任务
task.getData()
相关文章:
延迟任务基于DeyalQueue
一,延迟任务应用场景? 一般用于处理订单,将redis中的数据延迟存入数据库,实现异步存储减少DB的压力 二, 延迟任务的实现方案有很多 DelayQueue Redisson MQ 时间轮 原理 JDK自带延迟队列,基于阻塞队列…...
Linux 查询端口被占用命令
Linux 查询端口被占用命令 1、lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000 lsof -i:8080:查看8080端口占用 lsof abc.txt:显示开启文件abc.txt的进程 lsof -c abc:显示abc进…...
【c++】string类---标准库中的string类
1. 为什么要学习string类 1.1 C语言中的字符串 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列 库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且…...
GO语言学习笔记(与Java的比较学习)(五)
Map 概念 map 是引用类型,可以使用如下声明: var map1 map[keytype]valuetype var map1 map[string]int 在声明的时候不需要知道 map 的长度,map 是可以动态增长的。 未初始化的 map 的值是 nil(即零值为nil)&…...
Sora:探索大型视觉模型的前世今生、技术内核及未来趋势
Sora,一款由OpenAI在2024年2月推出的创新性文生视频的生成式AI模型,能够依据文字说明,创作出既真实又富有想象力的场景视频,展现了其在模拟现实世界方面的巨大潜能。本文基于公开技术文档和逆向工程分析,全面审视了Sor…...
基于springboot实现图书馆管理系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现图书馆管理系统演示 摘要 电脑的出现是一个时代的进步,不仅仅帮助人们解决了一些数学上的难题,如今电脑的出现,更加方便了人们在工作和生活中对于一些事物的处理。应用的越来越广泛,通过互联网我们可以更方便地…...
MATLAB环境下基于高斯滤波器-广义拉普拉斯算子的细胞核自动检测
作为病理图像分析的基础,细胞核检测可为细胞形态、纹理等多种相关分析提供支持,对于临床诊断具有重要意义。但是细胞核的人工识别过程十分费时费力,并且不同医生之间存在主观标注差异。因此,利用计算机技术进行自动检测能够更为客…...
【探索AI】十一 深度学习之第1周:深度学习概述与基础
深度学习概述与基础 深度学习的发展历史与现状神经网络的基本原理前向传播与反向传播算法常见的激活函数与优化算法深度学习框架(如TensorFlow或PyTorch)进行基础操作 深度学习的发展历史与现状 深度学习的发展历史可以追溯到上世纪40年代,当…...
【简说八股】Spring事务失效可能是哪些原因?
Spring事务介绍 Spring事务是指在Spring框架中对数据库操作进行管理的一种机制,它确保一组数据库操作要么完全执行成功(提交),要么完全不执行(回滚),从而保持数据一致性和完整性。 Spring框架…...
【语音识别】- CTC损失计算的原理
文章目录 1.符号定义与目标函数2.前向计算 α s ( t ) \alpha_s(t) α...
MySQL字符集和比较规则
MySQL字符集和比较规则 字符集和比较规则简介 字符集: 描述字符与二进制数据的映射关系 比较规则:比较指定字符集中的字符的规则 字符集 我们知道,计算机无法直接存储字符串,实际存储的都是二进制数据。字符集是有限的ÿ…...
备忘录模式(Memento Pattern)
定义 备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在以后将对象恢复到该状态。备忘录模式通常用于实现撤销操作(Undo)或历史记录(H…...
LeetCode 刷题 [C++] 第121题.买卖股票的最佳时机
题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…...
ORACLE 基础
一.ORACLE简介 1.1什么是oracle ORACLE 数据库系统是美国 ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S 体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。…...
Adobe illustrator CEP插件调试
1.创建插件CEP面板,可以参考:http://blog.nullice.com/%E6%8A%80%E6%9C%AF/CEP-%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/%E6%8A%80%E6%9C%AF-CEP-%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B-Adobe-CEP-%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8…...
学会玩游戏,智能究竟从何而来?
最近在读梅拉妮米歇尔《AI 3.0》第三部分第九章,谈到学会玩游戏,智能究竟从何而来? 作者: [美] 梅拉妮米歇尔 出版社: 四川科学技术出版社湛庐 原作名: Artificial Intelligence: A Guide for Thinking Humans 译者: 王飞跃 / 李玉珂 / 王晓…...
Unity 常用操作
2D素材网站 https://craftpix.net/ https://itch.io/game-assets/tag-2d/tag-backgrounds 3D素材资源网址 https://www.mixamo.com/#/ 场景常用操作: 快捷键:QWER Q:Q键或鼠标中键,可以拉动场景。 W:选中物体后&…...
【计算机网络_应用层】协议定制序列化反序列化
文章目录 1. TCP协议的通信流程2. 应用层协议定制3. 通过“网络计算器”的实现来实现应用层协议定制和序列化3.1 protocol3.2 序列化和反序列化3.2.1 手写序列化和反序列化3.2.2 使用Json库 3.3 数据包读取3.4 服务端设计3.5 最后的源代码和运行结果 1. TCP协议的通信流程 在之…...
Doris实战——银联商务实时数仓构建
目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…...
代码随想录算法训练营第七天
● 自己看到题目的第一想法 第454题.四数相加II 方法: 方法一: 暴力法 思路: 注意: 代码: class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<i…...
OpenClaw新手避坑指南:Qwen3-14B镜像部署的5个常见失误
OpenClaw新手避坑指南:Qwen3-14B镜像部署的5个常见失误 1. 为什么需要这份避坑指南 第一次在本地部署OpenClaw对接Qwen3-14B镜像时,我踩遍了所有能想到的坑。从CUDA版本冲突到显存溢出,从端口占用到凭证失效,整个过程就像在玩&q…...
避坑指南:MediaPipe安装常见报错解决方案(附虚拟环境配置技巧)
MediaPipe实战避坑手册:从环境配置到高效开发的完整指南 在计算机视觉和机器学习领域,MediaPipe作为Google开源的多媒体处理框架,因其强大的实时感知能力和跨平台特性而备受开发者青睐。然而,许多开发者在初次接触MediaPipe时&…...
C# 13主构造函数+Records+With表达式三重组合技(.NET 8.0正式版实测):DTO层代码减少83%,但需绕过这个编译器Bug
第一章:C# 13主构造函数案例C# 13 引入了主构造函数(Primary Constructor)语法,允许在类或结构体声明时直接定义构造参数,并自动将参数提升为类型成员(如只读字段或属性),显著简化了…...
终极Flash浏览器指南:如何在现代系统中完美运行Flash游戏与网页
终极Flash浏览器指南:如何在现代系统中完美运行Flash游戏与网页 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser CefFlashBrowser是一个专为解决Flash内容在现代浏览器中无法运…...
孤能子视角:Kimi自我分析诊断[2],静态同构分析
(这也是Kimi的自分析诊断,上一分析为动态涌现法,这是静态同构法。里面所述技术及数值是否真实?)场域切换:静态同构模式已激活X光切片:当前互动场的截面解剖时间已冻结。以下是对"此刻的我"这一关系势能凝结体…...
MyBatis拦截器黑科技:不修改业务代码实现动态数据权限控制
MyBatis拦截器黑科技:零侵入实现企业级数据权限管控 在当今企业级应用开发中,数据权限控制是一个无法回避的核心需求。传统方案往往需要在每个SQL语句中硬编码权限条件,或者通过AOP切面批量修改Mapper接口,这些方法要么维护成本高…...
从PID到阻抗:机器人柔顺控制的模型演进与动力学角色
1. PID控制的本质与局限性 我第一次接触机器人控制时,导师就让我从PID开始学起。这个诞生于上世纪的控制算法,至今仍是工业界的"万金油"。但真正用它做过机器人项目的人都知道,PID就像一把锤子——简单粗暴但缺乏灵活性。 PID的核心…...
OpenClaw夜间值守:Qwen2.5-VL-7B实现服务器监控截图报警
OpenClaw夜间值守:Qwen2.5-VL-7B实现服务器监控截图报警 1. 为什么需要夜间值守方案 凌晨三点,我的手机突然响起刺耳的警报声——服务器CPU负载飙升至98%。当我手忙脚乱地远程连接服务器时,业务已经中断了15分钟。这次事故让我意识到&#…...
ACM模式
学习视频: 一个视频讲明白ACM模式!_哔哩哔哩_bilibili 输入 data list(map(int,input.split())) 假设你在键盘上输入了这样一行数字:10 20 30,然后按了回车。 第一层(最里面):input() 动作&…...
嵌入式轻量级RPC实现:裸机与RTOS下的远程过程调用
1. RPCInterface 库深度解析:嵌入式系统远程过程调用的轻量级实现RPC(Remote Procedure Call,远程过程调用)在嵌入式系统中长期被视为“高不可攀”的技术——常与大型操作系统、复杂网络栈和资源消耗挂钩。然而,在工业…...
