java - 定时器
一、什么是定时器
定时器是指可以通过 Java 中的 Timer 类和 TimerTask 类所提供的功能来实现定期执行某些任务的工具。
标准库中提供了一个 Timer 类 . Timer 类的核心方法为 schedule .schedule 包含两个参数 . 第一个参数指定即将要执行的任务代码 , 第二个参数指定多长时间之后执行 ( 单位为毫秒).下面是一个示例代码,用于创建一个定时器, 5 秒钟后打印一条消息:
import java.util.Timer; import java.util.TimerTask;public class TimerExample {public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new TimerTask() {public void run() {System.out.println("5 秒钟已经过去了...");}}, 5000);} }
在上述代码中,我们首先创建一个 Timer 对象,然后使用 schedule 方法安排一个 TimerTask 对象在 0 秒后开始运行, 5 秒钟后再次运行。在 TimerTask 的 run 方法中,我们打印了一条简单的消息。
总之,Java 中的定时器是一种可以用来实现定期执行某些任务的工具,在开发中,我们可以根据具体需求来设计和使用相应的定时器,来进行任务的调度和处理。
二、实现定时器
定时器的构成 :
- 一个带优先级的阻塞队列
为啥要带优先级呢?
因为阻塞队列中的任务都有各自的执行时刻 (delay). 最先执行的任务一定是 delay 最小的. 使用带优先级的队列就可以高效的把这个 delay 最小的任务找出来.- 队列中的每个元素是一个 MyTask 对象.
- MyTask 中带有一个时间属性, 队首元素就是即将
- 同时要创建线程一直扫描队首元素, 看队首元素是否需要执行
class MyTask implements Comparable<MyTask>{public Runnable runnable;public Long time;//为了方便后续判定,使用绝对的时间戳public MyTask(Runnable runnable, Long delay) {this.runnable = runnable;//取当前时刻的时间戳 + delay, 作为该任务实际执行的时间戳this.time = System.currentTimeMillis() + delay;}@Overridepublic int compareTo(MyTask o) {return (int)(this.time-o.time);}
}
public class MyTimer {//带有优先级的阻塞队列private PriorityBlockingQueue<MyTask> priorityBlockingQueue = new PriorityBlockingQueue<>();private Object locker = new Object();public void schedule(Runnable runnable,long delay){MyTask task = new MyTask(runnable,delay);//放任务priorityBlockingQueue.put(task);synchronized (locker) {locker.notify();}}public MyTimer(){Thread t = new Thread(() -> {while(true){synchronized (locker) {try {//取任务MyTask take = priorityBlockingQueue.take();//任务的时间Long curTime = System.currentTimeMillis();if(take.time <= curTime){//时间到了,可以执行任务take.runnable.run();}else{//时间没到,把任务重新放回到队列里priorityBlockingQueue.put(take);//locker.wait(take.time-curTime);}} catch (InterruptedException e) {e.printStackTrace();}}}});t.start();}}
相关文章:
java - 定时器
一、什么是定时器 定时器是指可以通过 Java 中的 Timer 类和 TimerTask 类所提供的功能来实现定期执行某些任务的工具。 标准库中提供了一个 Timer 类 . Timer 类的核心方法为 schedule . schedule 包含两个参数 . 第一个参数指定即将要执行的任务代码 , 第二个参数指定多…...

jQuery【菜单功能、淡入淡出轮播图(上)、淡入淡出轮播图(下)、折叠面板】(五)-全面详解(学习总结---从入门到深化)
目录 菜单功能 淡入淡出轮播图(上) 淡入淡出轮播图(下) 折叠面板 菜单功能 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><…...
攻防非对称问题| 当前企业面临的网络攻防非对称问题及其解决途径
随着信息技术的不断发展,网络已经成为我们日常生活和商业活动中不可或缺的一部分。然而,随之而来的是网络安全问题的不断升级。网络攻防非对称问题是当前亟待解决的一个复杂而严峻的挑战。其主要的表现是攻击成本远低于防御成本以及相同投入带来的攻击能…...

Java多线程二-线程安全
1、线程安全问题 多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题。 2、实例:取钱的线程安全问题 2.1、场景 小明和小红是夫妻,他们有个共同账户,余额是十万元,如果两人同时取钱并且各自取…...
Rust个人学习之结构体
第一反应,Rust结构体跟python的很像,不知道感觉对不对; 书中提到第一反应,Rust结构体跟python的很像,不知道感觉对不对; 书中提到:结构体是一种自定义数据类型,它允许命名多个相关的…...
kafka详细讲解与安装
Kafka是一种分布式流处理平台,具有高吞吐量、可扩展性和容错性。它最初由LinkedIn开发,现已成为Apache软件基金会的顶级项目。Kafka广泛应用于实时数据流处理、日志收集、消息队列等场景。 以下是关于Kafka的简要讲解和安装步骤: 一、Kafka…...

在我国干独立游戏开发有多难?
游戏独立开发在中国,一直以来都是一条充满挑战的道路。尽管有着无限的激情和创意,但面对市场、资金、政策等多方面的困难,许多独立开发者在这条路上艰难前行。 首先,市场竞争激烈是中国游戏独立开发者面临的首要挑战。随着游戏产…...
不可错过的网上宝藏:2023年必看的顶级资源大盘点!
亲爱的“AI uTools”读者们,大家好! 在这个信息爆炸的时代,互联网上充满了无数的资源,但如何从这海量信息中挑选出真正有用的宝藏呢?今天,我为大家精心挑选了一系列优质网站资源,涵盖了从文本处…...

日本服务器访问速度和带宽有没有直接关系?
对于许多网站和应用程序来说,服务器的访问速度是至关重要的。用户希望能够快速加载页面、上传和下载文件,而这些都与服务器的带宽有关。那么,日本服务器的访问速度和带宽之间是否存在直接关系呢? 我们需要了解什么是带宽。带宽是指网络…...
[vxe-table] vxe-table-column配合v-if导致列样式与位置错乱
<vxe-table-column v-if"pageInfo.id 4 ||pageInfo.id 8" title"上报类型" width"100" key1><template v-slot"{row}"><span>咨询工具</span></template> </vxe-table-column>//或者<vxe-ta…...
C# 忽略大小写
在 C# 中,你可以通过以下几种方式来忽略大小写: 使用 ToLower 或 ToUpper 方法将字符串转换为全小写或全大写,然后进行比较。使用 Compare 或 CompareOrdinal 方法,并传入正确的 StringComparer 实例以指示比较应该忽略大小写。使…...

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训
大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训 在当今数字化时代,大数据技术的迅猛发展带来了前所未有的数据增长,同时也催生了对数据安全和网络安全的更为迫切的需求。本篇博客将聚焦于大数据技术背景下的数据安全与网络安全ÿ…...
[datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
引言: 随着科技的进步,勒索病毒变得越来越复杂,而[datastorecyberfear.com].Elbie、[thekeyisherecock.li].Elbie勒索病毒是其中的一种令人头疼的威胁。本文将深入介绍[datastorecyberfear.com].Elbie、[thekeyisherecock.li].Elbie勒索病毒…...

【咕咕送书 | 第六期】深入浅出阐述嵌入式虚拟机原理,实现“小而能”嵌入式虚拟机!
🎬 鸽芷咕:个人主页 🔥 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想,就是为了理想的生活! 文章目录 ⛳️ 写在前面参与规则引言一、为什么嵌入式系统需要虚拟化技术?1.1 专家推荐 二、本书适合谁&#x…...

论文阅读——DDeP(cvpr2023)
分割标签耗时且贵,所以常常使用预训练提高分割模型标签有效性,反正就是,需要一个预训练分割模型。典型的分割模型encoder部分通过分类任务预训练,decoder部分参数随机初始化。作者认为这个方法次优,尤其标签比较少的情…...

Docker | Docker常用命令
Docker | Docker常用命令 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨…...
精进:简单聊聊华为战略与DSTE
首发:麦子禾 作者:石头 在以前专题文中,石头聊华为市场管理MM、基于价值驱动的业务设计VDBD、轻量级战略流程五看三定、业务领先模型BLM、业务执行力模型BEM比较多,印象中石头没有具体谈过DSTE(从战略规划到执行&…...

强制删除文件
DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 强制删除文件,新建一个文本文件,将以上代码复制到文档中,保存,将文档重命名为delete.bat 如果弹窗提示修改后缀名可能导致文件不可用,也点击确认修改文件名称. 将需要强制删除的文件拖拽到这个delete.bat文件上,显示使用delete.bat打…...

Vue+ElementUI+C#技巧分享:周数选择器
文章目录 前言一、周数的计算逻辑1.1 周数的定义1.2 年初周数的确定1.3 周数的计算方法 二、VueElementUI代码实现2.1 计算周数2.2 获取周的日期范围2.3 根据周数获取日期范围2.4 控件引用2.4.1 控件引用代码分析2.4.2 初始化变量代码分析 2.5 周数选择器完整代码 三、C#后端代…...

【算法】FFT-1(递归实现)(不包括IFFT)
FFT 多项式多项式乘法复数及运算导数泰勒公式及展开式欧拉公式单位根 FFTCode IFFT 多项式 我们从课本中可以知道,一个 n − 1 n-1 n−1 次的多项式可以写成 a 0 a 1 x a 2 x 2 a 3 x 3 ⋯ a n − 1 x n − 1 a_{0}a_{1}xa_{2}x^2a_{3}x^3\dotsa_{n-1}x^{n-…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
用 FFmpeg 实现 RTMP 推流直播
RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...
PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础
在构建任何动态、数据驱动的Web API时,一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说,深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言,以及学会如何在Python中操作数据库,是…...

ABAP设计模式之---“Tell, Don’t Ask原则”
“Tell, Don’t Ask”是一种重要的面向对象编程设计原则,它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则? 这个原则的核心思想是: “告诉一个对象该做什么,而不是询问一个对象的状态再对它作出决策。…...