Java中线程池的基本使用

news2024/11/13 8:14:05

参考这个课程,讲的非常详细 



27.线程池使用步骤总结_哔哩哔哩_bilibili

应用场景

商品秒杀
 

文件上传
 

订票系统


自定义线程池(让我们了解底层逻辑的)


 

构造方法


 

饱和机制
 

就是我们的队列饱和后我们该怎么处理
 

是拒绝这个任务还是啥

 

工作流程介绍




 


 


 

参数设计和分析
 

核心线程数量和任务队列长度


 


 

最大线程数和最大空闲时间



 

线程类和任务类代码实现


 


 

MyTask 是我们的线程类,我们连接了Runnable接口


 

MyWork是我们的任务执行类,连接Thread接口,里面执行run()方法


 

线程类和测试类编写
 

线程池类


 


 


 


 

提交任务,我们把任务扔到List队列里面


 


 

执行任务


 



 

测试类
 


 

逻辑
 

MyTasks提交任务给线程池MythreadPool
 

MyThreadPool再用任务类MyWorker来执行
总结

用.start()调用MyWorker类里面的run方法
 

传过去的Runnable类型,是Task任务类,我们用start()调用里面的run()方法


Java内置线程池

ExecutorService介绍
 


 


 

Executors工厂类介绍
 


 


 

newCachedThreadPool() 创建一个默认的线程池对象,里面的线程可重用,且在第一次使用时才创建
 

newCachedThreadPool(ThreadFacotry threadfactory)线程池中的所有线程都使用ThreadFacotry来创建,这样的线程无需手动启动,自动执行
 


 

newFixThreadPool() 创建一个可重用固定线程数的线程池
 

newFixThreadPool(ThreadFacotry threadfactory) 创建一个可重用固定线程数的线程池,且线程池中的所有线程都使用ThreadFacotry来创建
 


 

newSingleThreadExecutor() 创建一个使用单个worker线程的Executor,以无界队列方式来运行该线程
 

newSingleThreadExecutor(ThreadFacotry threadfactory)
 

创建一个使用单个worker线程的Executor,且线程池中的所有线程都使用ThreadFacotry来创建
 


 

newCachedThreadPool()获取ExcecutorService并且提交任务


 


 

反正就是,要执行的类,要连接Runnable接口,然后把这个连接了Runnable接口的类传给线程池
 

使用工厂类来创建线程池对象
 

control+p,观察一下形参


 

new ThreadFactory(),实现一个匿名内部类方法


 

然后我们的内部是return一个Thread
 

这里面的形参可以指定我们的线程的名称等等


无限个线程


newFixedThreadPool


 

加多了个指定线程数量


 


 

指定了3个线程,所以最多用到3个线程
 

Single,只有一个线程


 


 


 


 

shutDown和shutDownNow方法


 

shutDown,不能再提交新的任务了


 


 

shutDownNow


 

ScheduleExecutorService获取方式和常用方法介绍
 

如果我们还有其他需求
 

例如我们提交后我们想延迟一段时间
 

或者我们想每次间隔一段时间

 

允许延时任务和定时任务


 


 

延迟执行任务入门练习
 

我们的延迟任务不用start()了,用schedule(任务,延迟时间,时间的单位)


 


 

scheduleAtFixedRate()方法执行任务
 


 

如果我们用ThreadFactory()工厂创建后
 

我们用scheduleAtFixRate()来提交任务

 

scheduleWithFixedDelay()方法执行任务
 

和上面那种方法的不同,在于时间间隔的不同


 

任务执行时间不记录到间隔时间之内
 

任务结束之后才开始计算时间

 

Single线程池用这个方法调用


 



 

总结


 


Future介绍(异步计算结果)
 



 

submit()方法里面


 

形参是Callable类型
 

或者Runnable类型
 

是有返回值的
 



 

这个返回值就是我们的异步计算结果
 

有时候我们需要获取线程的计算结果来进行计算


 

方法

cancel()
 

get()
 

isCancelled()
 

isDone()
 


 

Future代码展示
 


 


 

submit()的返回值类型是Callable类型
 

也就是我们的Future类型
 

然后这个里面有我们的异步计算结果,可以根据它来进行操作
 

结束后记得关闭线程池



 


 


 

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

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

相关文章

API 技术开发分享:连接电商平台数据获取的桥梁

在当今数字化的时代,API(Application Programming Interface,应用程序编程接口)技术成为了实现不同系统之间通信和数据交换的关键。它就像是一座无形的桥梁,使得各种应用能够相互协作,共享资源,…

网页突然被恶意跳转或无法打开?DNS污染怎么解决?

前言 在网上冲浪时,我们时常会遭遇DNS污染这一区域性攻击,几乎无人能幸免。受影响时:尝试访问正规网站可能会被错误导向赌博、色情或其他恶意站点。 1.我们为什么需要DNS 当我们想要访问一个网站时,就像拨打朋友的电话号码一样…

第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024,9月13-15)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。 本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、…

docker笔记6-数据卷

docker笔记6-数据卷 一、初识dockerfile1.1 编写镜像1.2 构建镜像1.3 运行镜像 二、案例2.1 多个容器共享数据2.2 多个mysql数据共享 一、初识dockerfile 之前的内容中,我们都是通过pull的方式拉取别人写好的镜像,那么通过编写dockerfile,我…

Linux系统编程:传输层(补充)

1. 用UDP实现可靠传输 在前面介绍了UDP是一种不可靠的面向数据包的传输协议。那么如何实现UDP的可靠传输呢? 其实就是在应用层自己实现像TCP一样的可靠性机制:引入序列号、引入确认应答、超时重传、流量控制、拥塞控制等机制。 2. listen系统接口 在…

四向穿梭车价格战进入下半场,杀入单台10万区间~

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 近年来,仓储自动化设备市场蓬勃发展,其中四向穿梭车作为新兴明星产品,正在引领一场仓储革命。 数据显示,2023年中国托盘四向穿梭车销量…

初学Mybatis之 Lombok 篇

idea 安装 Lombok 插件&#xff1a; File->Settings->Plugins->搜索 lombok 下载 在项目中导入 lombok 的 jar 包&#xff1a; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.…

麦田物语第十五天

系列文章目录 麦田物语第十五天 文章目录 系列文章目录一、构建游戏的时间系统二、时间系统 UI 制作总结 一、构建游戏的时间系统 在该游戏中我们要构建年月日天时分秒等时间的概念&#xff0c;从而实现季节的更替&#xff0c;昼夜的更替等&#xff08;不同的季节可以播种不同…

机器学习课程学习周报五

机器学习课程学习周报五 文章目录 机器学习课程学习周报五摘要Abstract一、机器学习部分1.1 向量序列作为模型输入1.1.1 文字的向量表达1.1.2 语音的向量表达 1.2 自注意力机制原理1.2.1 自注意力机制理论1.2.2 矩阵运算自注意力机制 1.3 多头自注意力1.4 位置编码1.5 截断自注…

Nginx中WebSocket配置说明

查看 laravel 的 swool扩展文档时遇到不懂的&#xff0c;问了文心一言 https://gitee.com/resourcesplus/laravel-s/#%E5%90%AF%E7%94%A8websocket%E6%9C%8D%E5%8A%A1%E5%99%A8 nginx语法中 upstream 和 proxy_pass 用法

Linux--Socket编程UDP

前文&#xff1a;Socket套接字编程 UDP协议特点 无连接&#xff1a;UDP在发送数据之前不需要建立连接&#xff0c;减少了开销和发送数据之前的时延。尽最大努力交付&#xff1a;UDP不保证可靠交付&#xff0c;主机不需要维持复杂的连接状态表。面向报文&#xff1a;UDP对应用层…

PTPD 在 QNX 系统上的授时精度验证与误差排查

文章目录 0. 引言1.关键函数实现2. 验证策略与结果3. 授时误差的排查与解决3. 授时误差的排查与解决4. 结论 0. 引言 PTPD是一种时间同步的开源实现&#xff0c;在不同操作系统上的表现可能存在显著差异。 本文通过在QNX系统上运行PTPD&#xff0c;针对其授时精度进行详细验证…

MySQL:增删改查、临时表、授权相关示例

目录 概念 数据完整性 主键 数据类型 精确数字 近似数字 字符串 二进制字符串 日期和时间 MySQL常用语句示例 SQL结构化查询语言 显示所有数据库 显示所有表 查看指定表的结构 查询指定表的所有列 创建一个数据库 创建表和列 插入数据记录 查询数据记录 修…

游泳馆押金原路退回源码解析

<dl class"list "><dd class"address-wrapper dd-padding"><div class"address-container"><cyberdiv style"color:#f0efed;font-size:14px;float:right;position:absolute;right:10px;top: 2px;">●●●<…

正点原子imx6ull-mini-linux字符驱动模板(0)

1&#xff1a;驱动模块的加载和卸载 module_init(xxx_init); //注册模块加载函数 module_exit(xxx_exit); //注册模块卸载函数 1.1&#xff1a;新建一个用于存放linux驱动的目录,当然这个目录位置没有要求。创建要加载的模块chrbase.c cd ~/linux/drivers makdir linux_driv…

【安卓】Android Studio简易计算器(实现加减乘除,整数小数运算,正数负数运算)

目录 前言 运算效果 一、创建一个新的项目 二、编写xml文件&#xff08;计算器显示页面&#xff09; 三、实现Java运算逻辑 ​编辑 完整代码 xml文件代码&#xff1a; Java文件代码&#xff1a; 注&#xff1a; 前言 随着移动互联网的普及&#xff0c;手机应用程序已…

fetchApi === 入门篇

目录 fetch 基本认知 fetch 如何使用 Response对象&#xff08;了解&#xff09; 常见属性 常见方法 fetch 配置参数 fetch发送post请求 fetch 函数封装 fetch 实战 - 图书管理案例 渲染功能 添加功能 删除数据 完整代码 fetch 基本认知 思考&#xff1a; 以前开发…

PCIe总线-Linux内核PCIe软件框架分析(十一)

1.简介 Linux内核PCIe软件框架如下图所示&#xff0c;按照PCIe的模式&#xff0c;可分为RC和EP软件框架。RC的软件框架分为五层&#xff0c;第一层为RC Controller Driver&#xff0c;和RC Controller硬件直接交互&#xff0c;不同的RC Controller&#xff0c;其驱动实现也不相…

永结无间Ⅰ--基于 LLM 的 AGI

在过去几周&#xff0c;传奇人物 Francois Chollet 发起的ARC 挑战引起了不小的轰动。这项挑战让很多 AI 研究人员感到困惑&#xff0c;它表明了所有 AI 系统都存在泛化能力不足的问题。ARC 上上一次 SOTA AI 的准确率约为 34%&#xff0c;而在同一挑战中&#xff0c;Mechanica…

【React】Context机制跨层传递数据详解

文章目录 一、React Context的概念二、创建和使用Context1. 创建Context2. 使用Provider提供数据3. 使用Consumer获取数据 三、使用useContext Hook四、动态更新Context值五、Context的实际应用场景1. 主题切换2. 用户认证状态 六、注意事项 在开发React应用时&#xff0c;我们…