实现计时器

一、计时器

Java的标准库中,为我们提供了 计时器 的实现,让我们先来试着使用它.

 public static void main(String[] args) throws InterruptedException{Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("hello timer 3000");}},3000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("hello timer 2000");}},2000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("hello timer 1000");}},1000);System.out.println("hello main");Thread.sleep(5000);timer.cancel();}

创建timer实例后,我们可以调用schedule方法进行传参,第一个参数是要执行的方法,第二个参数是需要等待的时间.

二、实现计时器

让我们尝试来实现一个简单的计时器

当a创建好后,使用schedule,就会创建出一个线程,来查看是否有需要执行的任务.

传入的run方法会构造出一个Runnable放入队列中等待执行.

没有就等待,有就把任务从队列中删除并执行.

class MyTimerTask2 implements Comparable<MyTimerTask2>{private Runnable runnable;private long time;public MyTimerTask2(Runnable runnable,long delay){this.runnable = runnable;this.time = System.currentTimeMillis()+delay;}public void run(){runnable.run();}public long getTime(){return time;}@Overridepublic int compareTo(MyTimerTask2 o) {return (int)(this.time-o.time);}
}class MyTimer2{Thread t = null;private PriorityQueue<MyTimerTask2> queue= new PriorityQueue<>();private Object locker = new Object();public void schedule(Runnable runnable,long delay){synchronized (locker){MyTimerTask2 task = new MyTimerTask2(runnable,delay);queue.offer(task);locker.notify();}}public void cancel(){t.interrupt();}public MyTimer2(){//查看队列是否可以执行t = new Thread(()->{while(!Thread.currentThread().isInterrupted()){try{synchronized (locker){while(queue.isEmpty()){locker.wait();}MyTimerTask2 task = queue.peek();long nowtime = System.currentTimeMillis();if(nowtime>=task.getTime()){queue.poll();task.run();}else {locker.wait(task.getTime() - nowtime);}}} catch(InterruptedException e){break;}}System.out.println("线程执行完成");});t.start();}
}public class ThreadDemo05 {public static void main(String[] args) throws InterruptedException{MyTimer2 a = new MyTimer2();a.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello ");}},3000);System.out.println("hello main");//Thread.sleep(3500);a.cancel();}
}

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

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

相关文章

GPT‑4o普通账户也可以免费用

网址 https://chatgpt.com/ 试了一下&#xff0c;免费的确实显示GPT‑4o的模型&#xff0c;问了一下可以联网&#xff0c;不知道能不能通过插件出图 有兴趣的可以试试

【诚邀加入】obdiag SIG:共筑OceanBase敏捷诊断,让问题排查变得更快更容易!

亲爱的OceanBase用户、技术爱好者及专业人士&#xff1a; 我们怀着无比激动的心情&#xff0c;正式向您发出加入obdiag SIG&#xff08;OceanBase敏捷诊断工具特别兴趣小组&#xff09;的诚挚邀请&#xff01;obdiag SIG 是一个专注于 OceanBase 敏捷诊断工具研发、推广及生态…

python 庆余年2收视率数据分析与可视化

为了对《庆余年2》的收视率进行数据分析与可视化&#xff0c;我们首先需要假设有一组收视率数据。由于实际数据可能无法直接获取&#xff0c;这里我们将使用模拟数据来演示整个过程。 以下是一个简单的步骤&#xff0c;展示如何使用Python&#xff08;特别是pandas和matplotli…

Acrobat Pro DC 2024 Mac软件安装包下载PDF2024 Mac安装教程

安装 步骤 1&#xff0c;双击打开下载好的安装包。 2&#xff0c;选择acrobat dc installer.pkg双击启动安装程序。 3&#xff0c;点击继续。 4&#xff0c;点击继续。 5&#xff0c;点击继续。 6&#xff0c;点击安装。 7&#xff0c;输入电脑密码。 8&#xff0c;软件安装中…

“手撕”String类+练习题

一、什么是String类 简单讲&#xff1a;是一个类&#xff01;创建字符串和字符串方法的类。 用 圈起来的叫字符&#xff0c;比如&#xff1a;a,b....里面只能有一个char类型的字符。 用" "圈起来的叫字符串&#xff0c;比如&#xff1a;"abc"..里面可以连…

【java】websocket对接微软语音实时识别

目录 1. pom依赖2. websocket接口3. 自定义输入流4. 自定义控制5. 自定义语音流6. 说明 1. pom依赖 <dependency><groupId>com.microsoft.cognitiveservices.speech</groupId><artifactId>client-sdk</artifactId><version>1.37.0</ve…

C# Stack用法

C#中的Stack&#xff08;堆栈&#xff09;是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构&#xff0c;用于在顶部添加和移除元素。Stack类位于System.Collections.Generic命名空间中&#xff0c;它允许存储特定类型的对象。以下是一些基本的Stack用…

如何搭建Sphinx文档

环境准备 Linux CentOS 7 方案 搭建一个文档网站&#xff0c;本文档使用的是tomcatsphinx。 Tomcat可以快速搭建出http服务&#xff0c;也可以使用apache httpd。 Sphinx作为文档网页自动生成工具&#xff0c;可以从reStructured文档转换为html文件。 Tomcat安装 创建/…

华为设备WLAN配置之AP上线

WLAN基础配置之AP上线 配置WLAN无线网络的第一阶段&#xff0c;AP上线技术&#xff1a; 实验目标&#xff1a;使得AP能够获得来自AC的DHCP地址服务的地址&#xff0c;且是该网段地址池中的IP。 实验步骤&#xff1a; 1.把AC当作三层交换机配置虚拟网关 sys Enter system view,…

PaddlePaddle----基于paddlehub的文字识别

识别的代码 要使用 PaddleHub 进行 OCR 文本识别&#xff0c;您可以使用 PaddleHub 提供的预训练模型 chinese_ocr_db_crnn_mobile。以下是一个示例 Python 代码&#xff0c;演示如何使用 PaddleHub 进行 OCR 文本识别&#xff1a; import paddlehub as hub import cv2# 加载预…

note-网络是怎样连接的1 浏览器内部

助记提要 常见浏览器使用的协议 4种HTTP方法 8种响应状态码类型 5种5种IP地址的含义域名查找的基本原理协议栈发送消息的4个阶段 第1章 浏览器生成消息 探索浏览器内部 1 浏览器输入的URL 常见协议 http(访问Web服务器)&#xff0c;ftp(从ftp服务器下载和上传)&#xff0c;f…

【XuperChain】一、搭建第一条区块链节点

一、准备环境&#xff1a; 下载git和golang即可 apt install git apt install golang二、拉取代码&#xff0c;编译XuperChain 通过此命令拉取XuperChain源码到本地 git clone https://github.com/xuperchain/xuperchain.git 拉取成功后&#xff0c;会代码保存到了xuperChain…

使用Python生成一束玫瑰花

520到了&#xff0c;没时间买花&#xff1f;我们来生成一个电子的。 Python不仅是一种强大的编程语言&#xff0c;用于开发应用程序和分析数据&#xff0c;它也可以用来创造美丽的艺术作品。在这篇博客中&#xff0c;我们将探索如何使用Python生成一束玫瑰花的图像。 准备工作…

【逻辑漏洞】重置/忘记密码安全问题

【逻辑漏洞】重置/忘记密码安全问题 密码重置令牌泄漏密码重置中毒电子邮件轰炸密码重置令牌生成方式太过简陋使用过期令牌用好的响应替换坏的响应尝试使用自己的重置令牌注销/密码重置中的会话失效 密码重置令牌泄漏 如果密码重置令牌包含在 URL 中&#xff0c;并且用户在请求…

野心是需要付出去达到的,而欲望就只是欲望

当你能分清楚自己的想法是野心还是欲望时&#xff0c;就没有那么焦虑了。 这是野心还是欲望&#xff1f; 理解这两者之间的区别&#xff0c;对于我们的情绪状态和生活决策有着重要的影响。本文将探讨如何区分野心与欲望&#xff0c;并分享如何通过这种理解来减少焦虑。 野心&a…

如何解决爬虫的IP地址受限问题?

使用代理IP池、采用动态IP更换策略、设置合理的爬取时间间隔和模拟正常用户行为&#xff0c;是解决爬虫IP地址受限问题的主要策略。代理IP池是通过集合多个代理IP来分配爬虫任务&#xff0c;从而避免相同的IP地址对目标网站进行高频次访问&#xff0c;减少被目标网站封禁的风险…

TransFormer学习之VIT算法解析

1.算法简介 本文主要对VIT算法原理进行简单梳理&#xff0c;下图是一个大佬整理的网络整体的流程图&#xff0c;清晰明了&#xff0c;其实再了解自注意力机制和多头自注意力机制后&#xff0c;再看VIT就很简单了 受到NLP领域中Transformer成功应用的启发&#xff0c;ViT算法尝…

详解ArcGIS 水文分析模型构建

目录 前言 项目环境、条件 Dem 数据预览 ArcGIS模型构建器 模型搭建 填洼 流向 流量 河流长度 栅格计算器 河流链接 河网分级 栅格河网矢量化 绘制倾泻点 栅格流域提取 集水区 盆域分析 栅格转面 模型应用 导出 py 文件 完善脚本 最终效果 结束语 前言 …

【时间复杂度和空间复杂度之间的故事】

【时间复杂度和空间复杂度之间的故事】 一.前言 二.时间复杂度定义时间复杂度的计算规则习题 三.空间复杂度定义计算方法习题空间复杂度 O(1)空间复杂度 O(n) 本文主要讲解关于时间复杂度与空间复杂度 &#x1f600;&#x1f603;&#x1f601;&#x1f601;&#x1f607;&…

linux驱动中amba框架的作用

一,linux amba使用原因 一些芯片的设备树上的很多片内外设的compatible属性为compatible = "arm,primecell",且在内核源码中找不到compatible匹配的驱动,这是因为这些驱动使用了arm提供的amba协议。AMBA是由ARM Holdings开发的一种广泛使用的片上互连规范,它为系…