当前位置: 首页 > news >正文

多线程案例(线程池)

White graces:个人主页

🙉专栏推荐:Java入门知识🙉

🙉 内容推荐:<计算坤是如何工作的>🙉

🐹今日诗词:百年兴衰皆由人, 不由天🐹


⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏

⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏


线程池

由来

由来: 进程的频繁创建销毁,会导致资源开销非常大,因此引入线程的来缓解这个问题,但是频率进一步提升,线程的开销也不能忽略了,这时候可以通过线程池来缓解这个问题.

线程池把经常使用的线程提前创建好,用完了也不要销毁释放,留着下次使用,这样节省了创建和销毁的开销,和函数非常相似,都是复用,不用重新分配资源创建任务,需要的时候从线程池中取出使用,不使用时就放回线程池,省去了创建和销毁开销

概念

概念: 提前把经常使用的线程在线程池中准备好,使用时从池中取出,用完再放回池中,这样就不用频繁从内核中申请空间创建线程了

线程池相关的类

类名: ThreadPollExecutor

构造方法有四种

我们只需要看最复杂的就可以了,最复杂的包括所以构造方法的参数

构造方法参数

构造方法参数: (int corePoolSize)核心线程数和(int maximumPoolSize)最大线程数

构造方法参数: (long keepAliveTime)保持存活时间和(TimeUnit unit)时间单位

构造方法参数:(BlockingQueue<Runnable> woreQueue)设置任务队列

构造方法参数:(ThreadFactor threadFactory)线程工厂

理解线程工厂之前我们来看看什么是工厂模式

工厂模式: 通过静态方法封装new操作,在静态方法中完成对象属性初始化的过程就是工厂模式

工厂模式的由来

构造方法参数:(ThreadFactor threadFactory)线程工厂

线程池最重要的参数

构造方法参数:(RejectedExecutionHandler)  任务拒绝策略

Executors工厂类

由于ThreadPoolExecutor构造方法参数特别多,用起来很麻烦,所以Executor工厂类对它进行了封装,提供了这几种参数

返回类型是ExecutorSevice

用法演示:

如何设置合适的线程数目

上面的方法中是随机给的线程数目, 那么该怎么选择一个合适的数目呢?

分成两种,看代码是CPU密集型还是IO密集型

CPU密集型

这个线程基本都在CPU上运行,比如1+....+100的操作

IO密集型

这个线程基本都在等待IO, 比如Scanner

正确的线程数目

极端情况下

CPU密集型: 不超过CPU最大核心线程数(N)

IO密集型: 可以远远超过CPU最大核心线程数

模拟实现线程池

这里我们模拟固定线程数目的线程池

步骤: 

1. 提供构造方法传入线程数目

2. 根据传入的数目创建线程

3. 将任务放到阻塞队列中

4. 每个线程从阻塞队列中取出并执行

具体代码实现

前三步

我们来写个案例来测试一下吧

这个问题很好解决

运行结果

美图分享

✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

相关文章:

  • TOGAF的核心-企业四大架构领域简介
  • Stanford斯坦福 CS 224R: 深度强化学习 (5)
  • Python-图片旋转360,保存对应图片
  • 代码随想录算法训练营第三十四天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
  • Qt5 互动地图,实现无人机地面站效果
  • 指纹识别概念解析
  • 【Linux】$()中的内容与不加$()时有什么区别
  • 请解释Java Web中的Filter过滤器的作用和常见应用场景。什么是Java Web中的Servlet API?请列举其核心接口和类。
  • 中间件-------RabbitMQ
  • 浅谈nginx配置文件
  • Hadoop运行wordcount实例任务卡在job running的多种情况及解决方法
  • 前端开发攻略---用Vue实现无限滚动的几种方法
  • 10款免费黑科技软件,强烈推荐!
  • Rolla‘s homework:Image Processing with Python Final Project
  • DLRover:蚂蚁集团开源的AI训练革命
  • php的引用
  • ES6指北【2】—— 箭头函数
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 2017届校招提前批面试回顾
  • 230. Kth Smallest Element in a BST
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CAP 一致性协议及应用解析
  • Create React App 使用
  • Python 基础起步 (十) 什么叫函数?
  • Python十分钟制作属于你自己的个性logo
  • vue脚手架vue-cli
  • Web Storage相关
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 猴子数据域名防封接口降低小说被封的风险
  • 将回调地狱按在地上摩擦的Promise
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 物联网链路协议
  • 找一份好的前端工作,起点很重要
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 如何用纯 CSS 创作一个货车 loader
  • # dbt source dbt source freshness命令详解
  • #define
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #includecmath
  • #Z2294. 打印树的直径
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (AngularJS)Angular 控制器之间通信初探
  • (HAL库版)freeRTOS移植STMF103
  • (javaweb)Http协议
  • (rabbitmq的高级特性)消息可靠性
  • (八十八)VFL语言初步 - 实现布局
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (计算机网络)物理层
  • (十二)Flink Table API
  • (四)Linux Shell编程——输入输出重定向
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)SpringBoot3---尚硅谷总结