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

JAVA理论第四战-线程池

4.1 为什么需要线程池

在实际使用中,线程时很占用系统资源的,如果对线程管理不完善的话很容易导致系统问题。因此对线程管理不完善的话很容易导致系统问题。因此,在大多数并发框架中都会使用 线程池来管理线程,使用线程池管理线程主要有如下好处:
  1. 使用线程池可以重复利用已有的线程执行任务,避免线程在创建时造成消耗
  2. 由于没有线程创建和销毁时的消耗,可以提高系统响应速度
  3. 通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小等

4.1.1线程池的主要核心原理

  1. 创建一个池子,池子中是空的
  2. 提交任务时,池子会创建新的线程对象,任务执行完毕,线程归还给池子下次再次提交任务时,不需要创建新的线程,直接复用已有的线程即可
  3. 但是如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待

4.2线程池的分类

  1. newCachedThreadPool:创建一个可进行缓存重复利用的线程池
  2. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,线程池中的线程处于一定的量,可以很好的控制线程的并发量
  3. newSingleThreadExecutor:创建一个使用单例worker线程的Executor,以无界队列方式来运行该线程。线程池中最多执行一个线程,之后提交的线程将会排在队列中以此执行
  4. newSingleThreadScheduledExecutor:创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期执行
  5. newScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行命令或者定期的执行
  6. newWorkStealingPool:创建一个带并行级别的线程池,并行级别决定了同一时刻最多有多少个线程在执行,如不传并行级别参数,将默认为当前系统的CPU个数

4.3 核心参数

ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor
  1. corePoolSize(正式员工数量):核心线程池的数量(大于0)
  2. maximumPoolSize(餐厅最大员工数):线程池能创建线程的最大数量(大于核心线程数)
  3. keepAliveTime(临时员工空闲多长时间被辞退):空闲线程存活时间
  4. unit(空闲时间的时间单位例如Hours):时间单位,为keepAliveTime指定时间单位
  5. workQueue(排队的客户):阻塞队列,用于保存任务的阻塞队列
  6. threadFactory(从哪里招人):创建线程的工程类
  7. handler(当排队人数过多,超出顾客请下次再来(拒绝服务):饱和策略(拒绝策略)

4.4 线程池的原理

当一个任务提交至线程池之后
  1. 线程池首先会判断核心线程池里的线程是否满了
    1. 如果没满,则创建一个新的工作线程
  2. 如果核心线程池满了,再去判断阻塞队列是否已经满了。
    1. 如果没有满,将任务存储的工作队列中
  3. 如果阻塞队列满了,再去判断线程池都满了
    1. 如果没有满,则创建一个新的工作线程来执行
    2. 如果满了按照饱和策略进行处理

4.5 拒绝策略

ThreadPoolExecutor.AbortPolicy(系统默认): 丢弃任务并抛出RejectedExecutionException异常,让你感知到任务被拒绝了,我们可以根据业务逻辑选择重试或者放弃提交等策略
ThreadPoolExecutor.DiscardPolicy:也就是 丢弃任务,但是不抛出异常,相对而言存在一定的风险,因为我们提交的时候根本不知道这个任务会被丢弃,可能造成数据丢失
ThreadPoolExecutor.DiscardOldestPolicy: 丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程),通常是 存活时间最长的任务,它也存在一定的数据丢失风险
ThreadPoolExecutor.CallerRunsPolicy:: 既不抛弃任务也不抛出异常,而是将某些任务回退到调用者,让调用者去执行它。

4.6 线程池的关闭

关闭线程池,可以通过 shutdownshutdownNow两个方法
原理:遍历线程池中的所有线程,然后依次中断
  1. shutdownNow:首先将线程池的状态设置为STOP,然后尝试停止所有的正在执行和未执行任务的线程,并放回等待执行任务的列表
  2. shutdown:只是将线程池的状态设置为SHUTDOWN状态,然后中断所有没有正在执行任务的线程
http://www.xdnf.cn/news/928189.html

相关文章:

  • 【AI论文】反思、重试、奖励:通过强化学习实现大型语言模型的自我提升
  • archlinux中使用 Emoji 字体
  • keil 5打开编译keil 4解决方案,兼容exe查找下载
  • 编程关键字
  • 【区块链基础】区块链的 Fork(分叉)深度解析:原理、类型、历史案例及共识机制的影响
  • 分类与扩展
  • 【推荐算法】推荐算法演进史:从协同过滤到深度强化学习
  • 「Java基本语法」代码格式与注释规范
  • 第二十七课:手搓梯度提升树
  • AI掘金时代:探讨如何用价值杠杆撬动付费用户增长
  • 记录下three.js学习过程中不理解问题①
  • 测试(面经 八股)
  • 《真假信号》速读笔记
  • Python爬虫实战:研究Unirest库相关技术
  • 王劲松《人民日报》撰文 重读抗战家书不忘来时路
  • Windows小说阅读软件推荐
  • Linux 文件系统核心:inode 与 block 深度解析(附实战案例与源码级原理)
  • 618来了,推荐京东云服务器
  • ROS C++ 实现消息通信与服务通信
  • 交叉熵损失函数和极大似然估计是什么,区别是什么
  • 关于队列的使用
  • 道路运输安全员考试分为哪些科目,各科目重点考察什么?
  • scratch农场小鸡 2024年全国青少年信息素养大赛 图形化编程 scratch变成挑战赛 复赛真题解析
  • string类型
  • Spring IoC 模块设计文档
  • libiec61850 mms协议异步模式
  • 如何构建船舵舵角和船的航向之间的动力学方程?它是一个一阶惯性环节吗?
  • 抖音怎么下载视频
  • 好未来0520上机考试题1:括号的最大嵌入深度
  • 零基础入门PCB设计 强化篇 第六章(实验——USB拓展坞PCB绘制)