<多线程章节十> 定时器的使用方法以及定时器的模拟实现

文章目录

  • 💐专栏导读
  • 💡Java标准库中的定时器类
  • 💡模拟实现定时器

💐专栏导读

本篇文章收录于多线程,也欢迎翻阅博主的其他文章,可能也会让你有不一样的收获😄
🍂JavaSE🌷多线程🍁数据结构

闹钟大家一定都使用过,当闹钟响的时候,就表示我们该起床了,或者是手机上的定时发短信,等到时间达到时,就会按照我们的要去发送短信等;定时器也就是这样一种工作组件,约定一个时间,当时间达到时,就会执行代码

定时器经常用于网络通信中,例如,当客户端向服务器发出一个请求后,就要等待服务器进行响应,但是,如果服务器一直没响应怎么办,是因为请求没发过去?响应没传过来?服务器出问题了等等,这中间你也不知道发生了什么,这时候,客户端难道就一直等着,等到天荒地老?所以,对于客户端而言,就需要一个等待时间,如果等待时间到了,是重新再发送一遍,还是放弃发送,还是其他的操作等等………

💡Java标准库中的定时器类

在Java的util包中,提供了一个Timer类,这个类就是一个定时器,下面通过代码演示:

public class MyTimer {public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new TimerTask() {//给定时器安排一个任务,约定在xxx时间后开始执行@Overridepublic void run() {System.out.println("定时器中任务开始执行");}}, 3000);//指定定时时间,约定在三秒之后开始执行System.out.println("程序执行");}
}

在这里插入图片描述

在执行schedule方法的时候,就是把这个任务放到了timer对象中,而且,在timer对象中,也包含了一个线程,这个线程叫作”扫描线程“,等约定时间到了以后,扫描线程就开始执行这个任务;然后通过执行结果也可以看到,定时器中的任务执行完之后,进程并没有结束,而是处于等待其他任务安排进来,所以由此得出,Timer中的线程会阻止进程结束,在Timer中同样也可以安排多个任务👇

在这里插入图片描述

在学习完如何使用一个定时器后,我们应该还知道如何实现一个简单的定时器👇

💡模拟实现定时器

实现一个定时器主要考虑一下几个步骤:

 class MyTimerTask {//顶一个一个任务private Runnable runnable;//定义一个定时时间public long time;public MyTimerTask(Runnable runnable, long delay) {this.runnable = runnable;this.time = System.currentTimeMillis()+delay;}public Runnable get_runnable() {return runnable;}
}
public class MyTimer {//定义一个队列用于组织任务private PriorityQueue<MyTimerTask> priorityQueue = new PriorityQueue<>(new Comparator<MyTimerTask>() {//自定义比较方法@Overridepublic int compare(MyTimerTask o1, MyTimerTask o2) {return (int)(o1.time - o2.time);}});//定义一个锁对象Object locker = new Object();//定义一个schedule方法public void schedule(Runnable runnable, long time) {/*因为是其他的线程调用schedule,然后对队列进行操作,而扫扫描线程也是对队列进行操作,这也就构成了两个线程对同一个数据进行操作,就可能会出现线程安全问题,因此要进行加锁*/synchronized (locker) {priorityQueue.offer(new MyTimerTask(runnable, time));locker.notify();}}//在构造方法中定义一个扫描线程public MyTimer() {Thread thread = new Thread(() -> {while(true) {//检查队列中的任务check_task();}});thread.start();}private void check_task() {try {synchronized (locker) {//当队列为空时,阻塞等待//使用while进行判断,防止唤醒wait时,队列仍然为空while (priorityQueue.isEmpty()) {locker.wait();}MyTimerTask myTimerTask = priorityQueue.peek();//判断当前时间与定时时间long curTime = System.currentTimeMillis();if(curTime >= myTimerTask.time) {//当前时间大于定时时间,开始执行任务myTimerTask.get_runnable().run();//任务执行完后删除priorityQueue.poll();}else {//为了防止忙等,在这里进行带有时间的wait等待//当时间到了以后,再进行循环,开始执行任务locker.wait(curTime - myTimerTask.time);}}}catch (InterruptedException e) {e.printStackTrace();}}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/171116.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

36基于matlab的对分解层数和惩罚因子进行优化

基于matlab的对分解层数和惩罚因子进行优化。蚁狮优化算法优化VMD,算术优化算法优化VMD&#xff0c;遗传优化算法优化VMD&#xff0c;灰狼优化算法优化VMD&#xff0c;海洋捕食者优化算法优化VMD&#xff0c;粒子群优化VMD&#xff0c;麻雀优化算法优化VMD&#xff0c;鲸鱼优化…

将安全作为首要目标 — Venus 的现状和前景展望

DeFi 的全面爆发将上一轮牛市推向巅峰。在不断的演化中&#xff0c;DeFi 领域也产生了很多新兴的细分领域&#xff0c;比如收益聚合器、合成资产、各种 DeFi 收益工具&#xff0c;以及最近整个市场都在讨论的 RWA 等。 DeFi 在不断进化&#xff0c;不变的是&#xff0c;DEX 和借…

Ocelot简易教程目录

Ocelot简易教程目录 这里写目录标题 Ocelot简易教程目录 Ocelot简易教程&#xff08;一&#xff09;之Ocelot是什么Ocelot简易教程&#xff08;二&#xff09;之快速开始1Ocelot简易教程&#xff08;二&#xff09;之快速开始2Ocelot简易教程&#xff08;三&#xff09;之主要特…

Makefile 基础教程:从零开始学习

在软件开发过程中&#xff0c;Makefile是一个非常重要的工具&#xff0c;它可以帮助我们自动构建程序&#xff0c;管理程序依赖关系&#xff0c;提高开发效率。本篇博客将从基础开始&#xff0c;介绍Makefile的相关知识&#xff0c;帮助大家快速掌握Makefile的使用方法 Makefil…

C#使用mysql-connector-net驱动连接mariadb报错

给树莓派用最新的官方OS重刷了一下&#xff0c;并且用apt install mariadb-server装上“mysql”作为我的测试服务器。然后神奇的事情发生了&#xff0c;之前用得好好的程序突然就报错了&#xff0c;经过排查&#xff0c;发现在连接数据库的Open阶段就报错了。写了个最单纯的Con…

应用案例|基于三维机器视觉的机器人引导电动汽车充电头自动插拔应用方案

Part.1 项目背景 人类对减少温室气体排放、提高能源效率以及减少对化石燃料的依赖&#xff0c;加速了电动汽车的普及&#xff0c;然而&#xff0c;电动汽车的充电依然面临一些挑战。传统的电动汽车充电通常需要人工干预&#xff0c;插入和拔出充电头&#xff0c;这不仅可能导致…

学会Docker之——界面化操作(Docker Desktop)

Docker Desktop 是一款用于在桌面环境下开发、构建和容器化应用程序的工具。它适用于 Windows 和 Mac 操作系统&#xff0c;让开发人员可以轻松地在本地环境中创建和运行容器&#xff0c;并与 Docker Hub 和其他容器注册表进行交互。Docker Desktop集成了Docker Engine&#xf…

Dataworks API:调取 MC 项目下所有表单

文章目录 前言Dataworks API 文档解读GetMetaDBTableList 接口文档 API 调试在线调试本地调试运行环境账密问题请求数据进一步处理 小结 前言 最近&#xff0c;我需要对公司的数据资产进行梳理&#xff0c;这其中便包括了Dataworks各个项目下的表单。这些表单&#xff0c;作为…

js中的Formdata数据结构

这里写目录标题 一、基本概念二、常用方法1.append(name, value)、set(name, value)2.get()、getAll()3.has(name)4.delete(name)5.keys(),values(),entries() 三、其他细节1.for of遍历2.转为对象3.结合 URLSearchParams 转为queryString 一、基本概念 FormData 提供了一种表…

【软考系统架构设计师】2023年系统架构师冲刺模拟习题之《软件工程》

在软考中软件工程模块主要包含以下考点&#xff1a; 文章目录 软件过程模型&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;逆向工程&#x1f31f;基于构件的软件工程&#x1f31f;&#x1f31f;软件开发与软件设计与维护净室软件工程软件模型软件需求 软件过程模型&am…

learning rate

这里写目录标题 learning rate单一固定&#xff08;one-size-fits-all&#xff09;的学习率Model训练到驻点很困难&#xff08;学习率太大不能收敛&#xff0c;学习率太小收敛太慢&#xff09; 如何客制化学习率&#xff1f;- 引入参数σσ常见的计算方式 - Root mean square&a…

P1868 饥饿的奶牛

根据题意可以知道是一个动态规划&#xff0c;看完数据范围之后可以知道是一个线性DP。 解决方法有点类似于背包问题&#xff0c;枚举背包的每一个空间。 如果把坐标轴上每个点都看成一个块儿&#xff0c;只需要按顺序求出前 i 个块儿的最大牧草堆数&#xff0c;f[i] 就是前i的…

【wespeaker】模型ECAPA_TDNN介绍

本次主要介绍开源项目wespeaker模型介绍 1. 模型超参数 model_args: feat_dim: 80 embed_dim: 192 pooling_func: “ASTP” projection_args: project_type: “softmax” # add_margin, arc_margin, sphere, softmax scale: 32.0 easy_margin: False 2. 模型结构 2.1 Layer…

【Javascript】ajax(阿甲克斯)

目录 什么是ajax? 同步与异步 原理 注意 写一个ajax请求 创建ajax对象 设置请求方式和地址 发送请求 设置响应HTTP请求状态变化的函数 什么是ajax? 是基于javascript的一种用于创建快速动态网页的技术&#xff0c;是一种在无需重新加载整个网页的情况下&#xff0c…

一个Entity Framework Core的性能优化案例

概要 本文提供一个EF Core的优化案例&#xff0c;主要介绍一些EF Core常用的优化方法&#xff0c;以及在优化过程中&#xff0c;出现性能反复的时候的解决方法&#xff0c;并澄清一些对优化概念的误解&#xff0c;例如AsNoTracking并不包治百病。 本文使用的是Dotnet 6.0和EF…

HarmonyOS鸿蒙原生应用开发设计- 流转图标

HarmonyOS设计文档中&#xff0c;为大家提供了独特的流转图标&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的流转图标内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的图标侵权意外情况等&#xff0c;减…

【Linux】Linux+Nginx部署项目

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.单体项目的部署 0.我们需要将要进行部…

数据结构与算法之矩阵: Leetcode 48. 旋转矩阵 (Typescript版)

旋转图像 https://leetcode.cn/problems/rotate-image/ 描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1 输入&…

评比无代码低代码平台时,可以考虑以下几个方面

无代码低代码平台是近年来兴起的一种软件开发工具&#xff0c;它们旨在帮助非技术人员快速创建应用程序&#xff0c;而无需编写大量的代码。这些平台通过提供可视化的界面和预先构建的组件&#xff0c;使用户能够通过拖放和配置的方式来构建应用程序。选择无代码低代码平台时&a…

【Jenkins 安装】

一&#xff1a;安装文件夹准备 在/home/admin 界面下新建三个文件夹&#xff0c;用来安装tomcat、maven 1.打开&#xff0c;/home/admin目录 cd /home/admin 2.新建三个文件夹 mkdir tomcat mkdir maven 二&#xff1a;安装tomcat 1.打开tomcat目录进行tomcat的安装 访问:h…