定时器使用

article/2025/10/10 19:35:16

目录

一、定时器简单介绍

二、定时器的使用

三、定时器的实现


一、定时器简单介绍

定时器就相当于是闹钟

在网络编程中定时器非常关键的

比如浏览器浏览某个网页网卡了,浏览器就会转圈圈(阻塞等待),这个等待不是无限等待,等到一定时间之后就显示访问超时

使用阻塞队列能够达到削峰填谷的效果,但是在削峰中会有大量的数据涌入队列,如果后续的服务器消费速率比较慢的话,队列里的有些元素可能要滞留很久,而浏览器在访问一段时间之后就会显示访问超时,这个时候即使服务器处理了这些信息也无法响应在对应的服务器上了,所以在这里可以使用定时器,让那些滞留时间太久的请求被删掉

在前端开发中也非常依赖定时器

例如,很多网站上有一些动画效果,也是通过定时器,比如每隔30秒,把页面往下滚动几个像素

二、定时器的使用

在Java标准库中,提供了这个定时器组件Timer

schedule:安排

import java.util.Timer;
import java.util.TimerTask;public class ThreadDemo25 {public static void main(String[] args) {System.out.println("代码开始执行");Timer timer=new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("触发定时器");}},3000);}
}

执行结果

三、定时器的实现

一个定时器里面是可以安排很多任务的,这些任务会按照时间,谁先到了时间就先执行谁

描述任务:直接使用Runnable来描述这个任务

组织任务:需要一个数据结构把很多任务放到一起,此处的需求是需要在一大堆任务中找到那个时间最先结束的任务,于是我们想到了优先级队列,此处我们最好选用带阻塞功能的优先级队列,目的是未来线程安全,而且标准库中也提供带阻塞功能的优先队列

具体思路为

1.提供一个schedule方法,这个方法是往阻塞队列中插入元素

2.需要让timer内部有一个线程,让这个线程一直去扫描队首元素,看看这个队首元素是不是到点了如果到点了,就执行这个任务,如果没到点,就把这个元素重新放回去,然后继续扫描

从上面的代码中,我们可以发现一个问题:就是 扫描的速度太快了

比如说最早的任务是早上8:00执行,但是当前才7:00,如果不采取措施的话,这个循坏会一直执行,而且执行的非常快,一秒就能转几万次,这段时间完全就是空转,完全没意义,我们称之它为“忙等”

此时我们想到了之前学过的sleep和wait

我们可以一个个分析

sleep和wait都可以指定一个时间作为参数,也就是等待的时间

等待的时间可以通过当前时间和首个任务之间的时间来算

就用刚刚的例子说明,wait需要等待1小时,sleep也需要等待1小时,但是wait可以,sleep却不行,具体原因是wait(1小时)是可以提前唤醒的,而sleep(1小时)不可以,如果中途加了一项需要7:30执行的任务,wait可以通过notify来唤醒,及时感知7:30的任务去执行,但sleep就错过这次的任务了

import java.util.concurrent.PriorityBlockingQueue;public class ThreadDemo26 {//使用这类来描述任务static class Task implements Comparable<Task>{//command表示这个任务是啥private Runnable command;//time表示这个任务什么时候到时间//这里的time使用毫秒级的时间戳private long time;//约定参数time是一个时间差(类似与3000ms)//希望this.time来保存一个绝对的时间(毫秒级时间戳)public Task(Runnable command, long time) {this.command = command;//System.currentTimeMillis()表示当前的时间,再加上time表示这个任务要执行的时间this.time = System.currentTimeMillis()+time;}public void run(){command.run();}@Overridepublic int compareTo(Task o) {return (int)(this.time-o.time);}}//写这个内部类是避免和标准库中的Timer冲突static class Timer{//使用这个带优先级版本的阻塞队列来组织任务private PriorityBlockingQueue<Task> queue=new PriorityBlockingQueue<>();//使用locker对象来解决忙等问题private Object locker=new Object();public void schedule(Runnable command,long delay){Task task=new Task(command,delay);queue.put(task);//每次插入新的任务都要唤醒扫描线程//让扫描线程能够重新计算wait的时间//保证新的任务不会错过synchronized (locker){locker.notify();}}public Timer(){//创建一个扫描线程,这个线程用来判定当前的任务是不是已经到时间了Thread t=new Thread(){@Overridepublic void run() {while(true){//取出队列的首元素,判定是不是到时间了try {Task task=queue.take();long curTime=System.currentTimeMillis();if(task.time>curTime){//说明时间还没到,暂时不执行//前面的take操作会把队首元素给删除掉//但是此时队首的元素还没有执行,所以不能删除,要重新把它给加回来queue.put(task);//进行等待synchronized (locker){locker.wait(task.time-curTime);}}else{//时间到了task.run();}} catch (InterruptedException e) {e.printStackTrace();//如果出现了interrupt()方法,就能够退出线程break;}}}};t.start();}public static void main(String[] args) {System.out.println("程序启动");Timer timer=new Timer();timer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello");}},3000);}}
}

运行结果

 


http://chatgpt.dhexx.cn/article/OcY1JpPX.shtml

相关文章

51单片机定时器/计数器(定时器中断)

51单片机定时器/计数器&#xff08;中断系统&#xff1a;定时器中断&#xff09; 实现功能 通过定时器终端控制LED灯 D1 间隔一秒闪烁 单片机型号&#xff1a;STC89C52 定时器介绍 1、51单片机定时器原理 定时器实质上就是一个加1计数器。它随着计数器的输入脉冲进行自加1&a…

定时器用法

在JavaScr中&#xff0c;定时器可以让我们在设定的时间间隔之后来执行代码&#xff0c;而不是在函数被调用后立即执行。而定时器分别有两种类型&#xff1a; 一次性定时器&#xff1a;仅在指定的延迟时间后触发一次。间隔性定时器&#xff1a;每隔一定的时间间隔就触发一次。 …

STM32定时器

目录 一 定时器的基本介绍 二 定时器的原理框图 1、定时器时钟 2 时基单元 3 捕获输入 4 PWM输出。 三 定时器的应用 1 定时器的基础定时计数功能 2 PWM比较输出 3 外部脉冲计数 a、外部触发输入&#xff08;ETR--外部时钟模式2&am…

SpringBoot定时器

SpringBoot定时器 1 介绍2 注解3 代码4 Cron表达式1. 格式2. 取值3. 特殊字符4. 经典案例 5 Cron既然那么麻烦就生成吧 1 介绍 定时器是一种控制任务延时调用&#xff0c;或者周期调用的技术。 作用&#xff1a;定时邮件、短信发送、更新数据、同步数据、检查数据库和缓存数据…

555定时器

555定时器 美国signetics公司1972年研制&#xff0c;取代机械式定时器&#xff0c;因为输入端有3个5k欧的电阻得名 电路结构 输入引脚 输出引脚 1.因为要接电容&#xff0c;电流较大&#xff0c;需要用oc门进行输出 2.需要接上拉电阻接vcc功能引脚 5号引脚对参考电压的影…

SysTick 定时器

11.1关于 SysTick 定时器 SysTick定时器(又名系统滴答定时器)是存在于Cortex-M3的一个定时器&#xff0c;只要是ARM Cotex-M系列内核的MCU都包含这个定时器。使用内核的SysTick定时器来实现延时&#xff0c;可以不占用系统定时器&#xff0c;节约资源。由于SysTick是在CPU核内…

JavaScript之定时器

定时器 一、 setTimeout() 定时器二、停止 setTimeout() 定时器三、setInterval() 定时器四、清除setInterval() 定时器五、电子时钟案例 在很多页面中&#xff0c;我们都可以看到一些倒计时或者和时间相关的效果&#xff0c;今天小熊将就JavaScript里面的倒计时做一概述。 首先…

STM32-通用定时器-定时器中断

1 STM32的定时器 STM32F103ZET6一共有8个定时器&#xff0c;其中分别为&#xff1a;高级定时器&#xff08;TIM1、TIM8&#xff09;&#xff1b;通用定时器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff09;&#xff1b;基本定时器&#xff08;TIM6、TIM7&#xff09;。 …

Python——定时器

1.定时器 Timer定时器源码实现&#xff0c;和自定义一个线程方式一样&#xff0c;都是继承Thread类&#xff0c;重写了run()方法&#xff0c;只是实现的功能是延时执行一个函数或方法。 &#xff08;1&#xff09;线程定时器(Timer)解释&#xff1a; Timer类是Thread的子类&a…

[JavaEE]定时器

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1.定时器的概念 2.标准库中的定时器 3.实现定时…

定时器的作用

一、简介。 在很多时候&#xff0c;我们设计网页时&#xff0c;为了某种表现形式&#xff0c;会使用到定时器这一功能&#xff0c;如&#xff1a;为了保证用户有仔细阅读我们的用户条款&#xff0c;我们会给确认按钮设置只有条款被打开&#xff0c;并超过5秒才允许点击。 二、…

定时器简介

文章目录 一.定时器基本介绍A.CPU时序B.定时器的原理 二.定时/计数器的相关寄存器A.定时器工作方式寄存器&#xff08;TMOD&#xff09;B.控制寄存器&#xff08;TCON&#xff09; 三.定时器的四种工作方式图解 一.定时器基本介绍 A.CPU时序 振荡周期&#xff1a;CPU外部晶振…

定时器基本常识

1.概念解读 1.1定时器和计数器&#xff0c;电路一样 1.2定时或者计数的本质就是让单片机某个部件数数 1.3当定时器用的时候&#xff0c;靠内部震荡电路数数 1.4当计数器用的时候&#xff0c;书外面的信号&#xff0c;读取针脚的数据 2.定时器怎么定时 定时器的本质原理&a…

定时器详解

1. 什么是定时器&#xff08;timer&#xff09; 定时器实际上就是Soc当中的一个内部外设。 &#xff08;1&#xff09;定时器与计数器 定时器常与计数器扯到一起&#xff0c;计数器也是soc当中的一个内部外设&#xff0c;计数器顾名思义是用来计数的&#xff0c;就和我们的秒…

定时器(Timer)

一、定时器是什么&#xff1f; 定时器类似于我们生活中的闹钟&#xff0c;可以设定一个时间来提醒我们。 而定时器是指定一个时间去执行一个任务&#xff0c;让程序去代替人工准时操作。 标准库中的定时器: Timer 方法作用void schedule(TimerTask task, long delay)指定dela…

STM32-定时器详解

目录 前言 一、定时器基本介绍 1. STM32定时器 2. 通用定时器功能和特点 3. 计数器模式 4. 定时器工作原理 a.定时器框图 b.时钟产生器部分 c.时基单元 d.输入捕获通道 e.输出比较通道&#xff08;PWM&#xff09; 二、定时器中断应用 1.内部时钟选择 2.计数器模式 …

typedef和#define

typedef是c语言中一个重要的关键字其作用是为一种数据类型定义了一个新的名字这里的类型包括&#xff08;int&#xff0c;char,double 等)和自定义数据类型&#xff0c;通俗一点来说就是为一种数据类型起一个别名 举个例子&#xff1a; 定义一个整型变量a并将其初始化为666&a…

typedef和define的区别、typedef的具体用法

typedef最核心的用法&#xff1a;给数据类型取别名&#xff0c;这个别名既可以是此数据类型的替换&#xff0c;也是指向此数据类型的指针。 具体用法&#xff08;对普通数据类型取别名&#xff09;&#xff1a; 对结构体数据类型取别名&#xff1a; typedef与define的区别&…

#define与typedef的区别

目录 &#xff08;1&#xff09;原理不同 &#xff08;2&#xff09;功能不同 &#xff08;3&#xff09;作用域不同 &#xff08;4&#xff09;对指针的操作不同 &#xff08;5&#xff09;补充 a.指针常量 b.常量指针 typedef和define都是替一个对象取一个别名&#x…

C语言中的typedef

C语言中的"typedef" 一、什么是typedef typedef是用于定义新的类型名&#xff0c;在编程中可以用typedef来定义新的类型名来代替已有的类型名 格式&#xff1a; typedef 已有类型名 新的类型名 通俗点说&#xff0c;就是为已有的类型取别名&#xff0c;例如 老鼠&am…