模拟实现线程池(线程数目为定值)和定时器

article/2025/8/6 7:28:14

前言

昨天学习关于定时器的相关知识。今天花时间去模拟实现了一个定时器,同时也去模拟实现了一个线程池(线程数目为定值)。我感觉我收获了很多,对于线程的理解加深了。跟大家分享一下~

 线程池和定时器(这个是主要)的实现

代码 

线程池

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
class MyThreadPool{//.创建任务队列private BlockingQueue<Runnable> blockingQueue=null;//.创建固定线程数目的线程池public MyThreadPool(int n) throws InterruptedException {//给任务队列给出容量大小blockingQueue=new ArrayBlockingQueue<>(1000);//创建线程for(int i=0;i<n;i++){Thread t=new Thread(()->{Runnable task= null;try {while(true){task = blockingQueue.take();task.run();}} catch (InterruptedException e) {throw new RuntimeException(e);}});
//          t.setDaemon(true);t.start();}}//提交任务,将任务放入任务队列public void submit(Runnable task) throws InterruptedException {blockingQueue.put(task);}
}public class demo40 {public static void main(String[] args) throws InterruptedException {MyThreadPool myThreadPool=new MyThreadPool(10);//往线程池里面提交任务for(int i=0;i<100;i++){int id=i;myThreadPool.submit(()->{System.out.println(Thread.currentThread().getName()+" "+id);});}}
}

 定时器

package Maybe;import java.util.PriorityQueue;class Mytimertask implements Comparable<Mytimertask>{private long time;private Runnable task;public Mytimertask(Runnable task,long time){this.task=task;this.time=time;}public void run(){task.run();}public long gettime(){return time;}@Overridepublic int compareTo(Mytimertask o) {return (int)(o.time-this.time);}
}
class Mytimer{Object locker=new Object();PriorityQueue<Mytimertask> queue=new PriorityQueue<>();public void schedule(Runnable task,long delay){synchronized(locker){Mytimertask task1=new Mytimertask(task,System.currentTimeMillis()+delay);queue.offer(task1);locker.notifyAll();}}public Mytimer(){Thread t=new Thread(()->{synchronized(locker){while(true){while(queue.isEmpty()){try {locker.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}Mytimertask task=queue.peek();if(task.gettime()>System.currentTimeMillis()){try {locker.wait(task.gettime()-System.currentTimeMillis());} catch (InterruptedException e) {throw new RuntimeException(e);}}else{task.run();queue.poll();}}}});t.start();}
}public class may {public static void main(String[] args) {Mytimer mytimer=new Mytimer();mytimer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 3000");}},3000);mytimer.schedule(new Runnable() {@Overridepublic void run() {System.out.println("hello 2000");}},2000);}
}

结语 

本次的分享就到此为止了~ 最近要期末了,自学的东西要慢下来了,等期末过后,再猛猛地学。

希望期末周能快点过~~  

 

 


http://www.hkcw.cn/article/YkFlJfmNoo.shtml

相关文章

JMeter 性能测试

1.定时器 1.1 同步定时器 作用&#xff1a;阻塞线程使同时达到n个线程之后再发出请求&#xff0c;模拟高并发的场景。 路径&#xff1a;右键请求--添加--定时器--Synchronizing Timer 2.2 常数吞吐量定时器 作用&#xff1a;模拟服务器负载&#xff0c;即需要服务器以一个固定…

通俗易懂的 JS DOM 操作指南:从创建到挂载

目录 &#x1f9e9; 1. 创建元素&#xff1a;document.createElement / createElementNS &#x1f4dd; 2. 创建文本&#xff1a;document.createTextNode ✏️ 3. 修改文本&#xff1a;node.nodeValue &#x1f5d1;️ 4. 移除元素&#xff1a;el.removeChild() &#x1…

串口通信技术及USART应用研究

串口通信技术及USART应用研究 # 串口通信技术及USART应用研究 摘要&#xff1a;本文深入探讨了串口通信技术的基本原理、硬件电路设计以及USART&#xff08;通用同步/异步收发器&#xff09;在STM32微控制器中的应用。首先对通信接口进行了概述&#xff0c;分析了不同通信协议…

OneRef论文精读(补充)

接上篇&#xff1a;OneRef论文精读 The five referring datasets 这些数据集应用于指代表达式理解&#xff08;REC&#xff09;、短语定位&#xff08;PG&#xff09;及指代表达式分割&#xff08;RES&#xff09;任务。表8列出了详细的统计数据。 RefCOCO/RefCOCO/RefCOCOg&…

vscode 代理模式(agent mode),简单尝试一下。

1. 起因&#xff0c; 目的: agent mode&#xff0c; 很流行&#xff0c;名气很大。简单试试效果&#xff0c;确实很强。agent mode&#xff0c; 取代人工&#xff0c;确实是前进了一大步。 2. 先看效果 效果对比&#xff0c;左边是 普通的AI 生成的&#xff0c; 右边是 代理…

Scratch节日 | 六一儿童节抓糖果

六一儿童节怎么能没有糖果&#xff1f;这款 六一儿童节抓糖果 小游戏&#xff0c;让你变身小猫&#xff0c;开启一场甜蜜大作战&#xff01; &#x1f3ae; 游戏玩法 帮助小猫收集所有丢失的糖果&#xff0c;收集越多分数越高&#xff01; 小心虫子一样的“坏糖果”&#xff…

【Linux系统】第八节—进程概念(上)—冯诺依曼体系结构+操作系统+进程及进程状态+僵尸进程—详解!

hi&#xff0c;我是云边有个稻草人 偶尔中二的博主^(*&#xffe3;(oo)&#xffe3;)^&#xff0c;与你分享专业知识&#xff0c;祝博主们端午节快乐&#xff01; Linux—本节博客所属专栏—持续更新中—欢迎订阅&#xff01; 目录 一、冯诺依曼体系结构 二、操作系统(Opera…

告别手动绘图!基于AI的Smart Mermaid自动可视化图表工具搭建与使用指南

以下是对Smart Mermaid的简单介绍&#xff1a; 一款基于 AI 技术的 Web 应用程序&#xff0c;可将文本内容智能转换为 Mermaid 格式的代码&#xff0c;并将其渲染成可视化图表可以智能制作流程图、序列图、甘特图、状态图等等&#xff0c;并且支持在线调整、图片导出可以Docke…

PCB设计教程【强化篇】——USB拓展坞PCB布局

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、前期准备与板框…

EC11旋转编码器,Versatile_RotaryEncoder库详解

旋转编码器与电位器 旋转编码器是电位器的现代数字等效物&#xff0c;并且用途更广泛。 旋转编码器可以不停地旋转360&#xff0c;而电位器只能旋转3/4圈。 电位器用于需要知道旋钮准确位置的情况。另一方面&#xff0c;旋转编码器用于需要知道位置变化而不是确切位置的情况…

【金融基础学习】债券回购方式

债券回购作为货币市场的重要工具&#xff0c;本质上是一种以债券为抵押的短期资金借贷行为。在银行间市场&#xff0c;质押式回购与**买断式回购*是两种主要形式。 1. 质押式回购(Pledged Repo, RP) – 所有权不转移的短期融资工具 1.1 质押式回购概述 质押式回购是交易双方…

助力高校AI教学与科研:GpuGeek推出618算力支持活动

618期间&#xff0c;GpuGeek推出面向高校师生的专属算力支持计划&#xff0c;6月5日至25日活动期间&#xff0c;完成学生认证的用户充值即可获得"学霸礼包"&#xff0c;同时平台算力嘉年华活动还将为用户提供额外算力赠送&#xff0c;有效降低了AI学习与研究的资源门…

多线程( Thread)

线程&#xff1a;是一个程序内部的一条执行流程。 多线程&#xff1a;是指从软硬件上实现的多条执行流程的技术&#xff08;多条线程由CPU负责调度执行&#xff09;。 创建线程&#xff1a; 多线程的创建方式之一&#xff1a;继承Thread类 1.定义一个子类MyThread继承线程类…

Vue-2-前端框架Vue基础入门之二

文章目录 1 计算属性1.1 计算属性简介1.2 计算属性示例 2 侦听器2.1 简单的侦听器2.2 深度监听2.3 监听对象单个属性 3 vue-cli3.1 工程化的Vue项目3.2 Vue项目的运行流程 4 vue组件4.1 Vue组件的三个部分4.1.1 template4.1.2 script4.1.3 style 4.2 组件之间的关系4.2.1 使用组…

LTSPICE仿真电路:(三十二)差动放大器电流源

1.差动放大器电流源 本来是和HOWLAND电流源在一起的&#xff0c;后面想着以后不一定好查找&#xff0c;不如重新另起一篇算了&#xff0c;和前一章的电流源有比较接近的地方&#xff0c;四个电阻直接变成差动放大器内部的东西。 方框中的就是差动放大器&#xff0c;也是负反馈…

Redis 缓存穿透、缓存击穿、缓存雪崩详解与解决方案

在分布式系统中&#xff0c;Redis 凭借高性能和高并发处理能力&#xff0c;成为常用的缓存组件。然而&#xff0c;在实际应用中&#xff0c;缓存穿透、缓存击穿、缓存雪崩这三大问题会严重影响系统的性能与稳定性。本文将详细解析这三个问题的成因&#xff0c;并提供对应的解决…

论文阅读笔记——Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset

I3D 论文 UCF-101&#xff08;13000多个视频&#xff09;和 HMDB-51&#xff08;7000多个视频&#xff09;数据集过小&#xff0c;提出了 Kinetics 数据集&#xff0c;并且在其之上预训练之后能够迁移到其他小的数据集。 2DLSTM&#xff1a;使用2D CNN的好处是可以直接从 Ima…

Azure devops 系统之五-部署ASP.NET web app

今天介绍如何通过vscode 来创建一个asp.net web app,并部署到azure 上。 创建 ASP.NET Web 应用 在您的计算机上打开一个终端窗口并进入工作目录。使用 dotnet new webapp 命令创建一个新的 .NET Web 应用,然后将目录切换到新创建的应用。 dotnet new webapp -n MyFirstAzu…

slider滑块async await

isselectionrangeenabled 特色属性 实际场景 视频缓存进度和观看进度 scrollbar 也可以 <StackPanel> <!-- 选择范围头尾相同&#xff0c;但 Slider 仍可操作 --> <Slider IsSelectionRangeEnabled"True" SelectionStart"30" SelectionEn…

LangChain-结合GLM+SQL+函数调用实现数据库查询(一)

业务流程 实现步骤 1. 加载数据库配置 在项目的根目录下创建.env 文件&#xff0c;设置文件内容&#xff1a; DB_HOSTxxx DB_PORT3306 DB_USERxxx DB_PASSWORDxxx DB_NAMExxx DB_CHARSETutf8mb4 加载环境变量&#xff0c;从 .env 文件中读取数据库配置信息 使用 os.getenv…