<JavaEE> 经典设计模式之 -- 定时器
目录
一、定时器的概念
二、Java 标准库中的定时器
三、实现自己的定时器
一、定时器的概念
什么是定时器? |
定时器是软件开发中的一个常用且重要组件,作用是在达到设定时间后,执行指定的代码。 |
二、Java 标准库中的定时器
1)Timer 类 |
在 Java 中,使用 Timer 类实现定时器的功能。Timer 类使用 schedule() 方法为定时器添加待执行任务。 |
2)schedule() 方法 |
schedule() 方法需要两个参数,第一个参数是计划执行的任务代码,第二个参数是任务等待多少时间后开始执行。 |
代码演示 Timer 类的使用:
public class Timer_Demo0 {public static void main(String[] args) {//新建定时器;Timer timer = new Timer();//设定任务为打印,等待3秒后执行;timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("3号举手");}},3000);//设定任务为打印,等待2秒后执行;timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("2号举手");}},2000);//设定任务为打印,等待1秒后执行;timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("1号举手");}},1000);}
}//运行结果:
1号举手
2号举手
3号举手
...程序没有结束运行。
3)为什么程序没有结束? |
Timer 类中,内置的线程是一个前台线程,只要有一个前台线程未结束,程序就不会停止运行。 |
三、实现自己的定时器
定时器结构分析 |
定时器可以设定多个任务,这些任务根据时间的先后,按顺序执行。 把这些任务放在一个队列中,每次要执行的任务,肯定是离计划时间最近的那个。 因此,使用优先级队列就可以达成这一目的。 |
优先级队列中需要存放的元素,就是通过 schedule() 方法加入的任务。 每个元素的属性,都应该包括一份可执行的代码和一个设定的时间。 |
我们还需要在定时器中有一个工作线程,用于观测优先级队列的队首元素,是否达到了执行时间。 |
代码演示实现自己的定时器:
//队列中的元素 MyTask 类;
class MyTask implements Comparable<MyTask>{//任务内容;private Runnable runnable;//执行时间,单位是一个毫秒级别的时间戳;private long time;public long getTime(){return time;}//使用任务内容和相对时间,构造MyTask;public MyTask(Runnable runnable,long delay){this.runnable = runnable;//系统当前时间+相对时间;this.time = System.currentTimeMillis()+delay;}public void run(){runnable.run();}//作为优先级队列的元素,需要可比较;@Overridepublic int compareTo(MyTask o) {return (int) (this.time - o.time);}
}//定时器类;
class MyTimer{//存放任务的队列;private PriorityQueue<MyTask> queue = new PriorityQueue<>();//保持监测的线程;private Thread t;//锁对象;private final Object locker = new Object();//schedule方法,向优先级队列中添加元素;public void schedule(Runnable runnable,long delay){synchronized (locker){MyTask task = new MyTask(runnable,delay);queue.offer(task);//入队列了,有元素了,可以唤醒线程了;locker.notify();}}//关闭定时器方法;public void cancel(){t.interrupt();}//定时器构造方法,new定时器时就把监测线程打开了;public MyTimer(){t = new Thread(()->{try {while (true){//加锁,下面的判断状态和修改数据的代码需要原子;synchronized (locker){//队列空了,线程就等待;if(queue.isEmpty()){locker.wait();}//查看任务是否到达执行时间;MyTask task = queue.peek();long curTime = System.currentTimeMillis();long taskTime = task.getTime();if(curTime >= taskTime){queue.poll();task.run();}else {//还没到达执行时间,则计算还有多久,并根据这个时间等待;locker.wait(taskTime - curTime);}}}}catch (InterruptedException e){//调用 cancel() 方法时,抛出这个异常,结束线程,并执行下述代码;System.out.println("定时器关闭");}});//线程在计时器被new出来时,就要保持运行的状态,随时监测任务队列;t.start();}
}
代码演示执行自己实现的定时器:
public static void main(String[] args) throws InterruptedException {//新建一个定时器;MyTimer timer = new MyTimer();//添加三个任务;timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("3号举手");}},3000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("2号举手");}},2000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("1号举手");}},1000);//等待5秒,此时上述定时器任务已经执行完毕;Thread.sleep(5000);//调用 cancel() 方法,关闭定时器。timer.cancel();}
阅读指针 -> 《经典设计模式之 -- 线程池》
<JavaEE> 经典设计模式之 -- 线程池-CSDN博客文章浏览阅读2次。简单介绍了线程池的概念,和Java标准库中的两个线程池相关类。其中,重点介绍了,ThreadPoolExecutor 类的使用和其构造方法参数的概念。另外还实现一个自己的线程池类。https://blog.csdn.net/zzy734437202/article/details/134860513
相关文章:
<JavaEE> 经典设计模式之 -- 定时器
目录 一、定时器的概念 二、Java 标准库中的定时器 三、实现自己的定时器 一、定时器的概念 什么是定时器?定时器是软件开发中的一个常用且重要组件,作用是在达到设定时间后,执行指定的代码。 二、Java 标准库中的定时器 1)T…...

【C++ Primer Plus学习记录】if语句
目录 一、if语句 二、if else语句 三、格式化if else语句 四、if else if else结构 一、if语句 if语句让程序能够决定是否应执行特定的语句。 if有两种格式:if和if else。 if语句的语法与while相似: if(test-condition)statement; 如果test-con…...

结构体,自定义类型
目录 结构体 结构体的声明 结构体的自引用 结构体的定义和初始化 结构体内存对齐 编辑 结构体的对齐规则: 为什么存在内存对齐? 修改默认对齐数 结构体传参 位段 什么是位段 位段的内存分配 位段的跨平台问题 枚举 联合(共用体…...

Ubuntu22.04通过Maas和Juju部署openstack charm
目录 官方文档材料准备软件硬件 模板机和虚拟网络安装MAAS官方文档MAAS节点配置安装MAAS浏览器登录MAAS进行配置 激活DHCP 官方文档 https://docs.openstack.org/project-deploy-guide/charm-deployment-guide/2023.1/ 这是一个通过Maas面板即可部署openstack的方式࿰…...

老有所依:TSINGSEE青犀养老院智能视频监管方案
养老院智能监控方案是为了提高养老院内老人的安全和护理质量,利用智能技术与监控设备进行全方位的监控和管理,可以加强对老人的监护和护理,提高养老院的服务质量和安全性。 旭帆科技基于视频技术与AI智能分析技术构建的养老院智能视频监控方…...

vue中的this.$nextTick().then()
MENU 示例一示例二sortsplicepushrandomfloorMathwhile演示 示例一 let reorganize function (arr){let rest [];while (arr.length > 0) {let random Math.floor(Math.random() * arr.length);// 把获取到的值放到新定义的数组中rest.push(arr[random]);// 这句代码的作…...
Python处理Excel文件并与数据库匹配做拼接
Python处理Excel文件并与数据库匹配做拼接 需求:Python处理Excel中数据并于数据库交互匹配得到账号信息等其他操作 Python实现 import os import pandas as pd import pymssql import warnings import time# 提取速率函数 def extract_broadband_speed(speed):if…...

【出现模块node_modules里面包找不到】
#pic_center R 1 R_1 R1 R 2 R^2 R2 目录 一、出现的问题二、解决办法三、其它可供参考 一、出现的问题 在本地运行 npm run docs:dev之后,出现 Error [ERR_MODULE_NOT_FOUND]: Cannot find package Z:\Blog\docs\node_modules\htmlparser2\ imported from Z:\Blo…...

高项备考葵花宝典-项目进度管理输入、输出、工具和技术(中,很详细考试必过)
项目进度管理的目标是使项目按时完成。有效的进度管理是项目管理成功的关键之一,进度问题在项目生命周期内引起的冲突最多。 小型项目中,定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切,可以视为一…...

sql注入 [GXYCTF2019]BabySQli1
打开题目 多次尝试以后我们发现存在一个admin的账号,但是密码我们不知道 我们尝试一下万能密码 admin or 11 -- q 报错 我们尝试bp抓一下包看看 看着很像编码 先去base32解码 再base64解码 得到 我们从这个sql语句中得到注入点为name 根据报错信息我们知道是…...

python二维数组创建赋值问题:更改单个值却更改了所有项的值
test_list [] dic1 {} test_list [dic1 for _ in range(3)] ll [1, 2, 3]for i in range(3):test_list[i][value] ll[i]print(test_list)运行结果:每次赋值都更改了所有项 原因:python的二位数据创建方式就是这样,官方文档中有描述Wha…...

深度模型训练时CPU或GPU的使用model.to(device)
一、使用device控制使用CPU还是GPU device torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 单GPU或者CPU.先判断机器上是否存在GPU,没有则使用CPU训练 model model.to(device) data data.to(device)#或者在确定有GPU的…...

SpringBoot3-实现和注册拦截器
1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…...

Ubuntu 22.04源码安装yasm 1.3.0
sudo lsb_release -r看到操作系统的版本是22.04,sudo uname -r可以看到内核版本是5.15.0-86-generic,sudo gcc --version可以看到版本是11.2.0,sudo make --version可以看到版本是GNU Make 4.3。 下载yasm http://yasm.tortall.net/Downlo…...
LeetCode [中等]矩阵置零
73. 矩阵置零 - 力扣(LeetCode) 暴力解法 用两个标记数组分别记录每一行和每一列是否有零出现。 遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。再次遍历该数组,用标…...

十一、了解分布式计算
1、什么是(数据)计算? 2、分布式(数据)计算 (1)概念 顾名思义,分布式计算,即以分布式的形式完成数据的统计,得到需要的结果。 分布式数据计算,顾名思义,就是…...
数据结构和算法专题---2、算法思想
上文讲到算法的概念、复杂度,本文给大家介绍具体的算法思想,让大家对算法设计理念有个认识,后续再分别介绍各种算法。 算法思想 算法是解决问题的一种思想和方法,其基本思想是将一个复杂问题分解为多个简单的子问题,…...

在AWS Lambda上部署标准FFmpeg工具——自定义层的方案
大纲 1 确定Lambda运行时环境1.1 Lambda系统、镜像、内核版本1.2 运行时1.2.1 Python1.2.2 Java 2 打包FFmpeg3 创建Lambda的Layer4 测试4.1 创建Lambda函数4.2 附加FFmpeg层4.3 添加测试代码4.4 运行测试 参考文献 FFmpeg被广泛应用于音/视频流处理领域。对于简单的需求&#…...
prometheus服务发现之consul
文章目录 前言一、Consul 在这里的作用二、原理三、实现过程安装 consul节点信息(exporter)注册进去consul节点信息(exporter)从consul解除注册:prometheus配置consul地址 总结 前言 我们平时使用 prometheus 收集监控…...
基于SSM的鞍山职业技术学院图书借阅管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的鞍山职业技术学院图书借阅管理…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...