当前位置: 首页 > 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.lqws.cn/news/211429.html

相关文章:

  • 动态可写的四层路由利器ngx_stream_keyval_module
  • WSF07N10 MOSFET 在铲皮机中的应用
  • 【西门子杯工业嵌入式-3-如何使用KEY】
  • 垃圾回收相关八股
  • Redis内存淘汰策略
  • 【Linux】LInux下第一个程序:进度条
  • 东芝Toshiba e-STUDIO2110AC打印机信息
  • 数据结构算法(C语言)
  • Ctrl-Crash 助力交通安全:可控生成逼真车祸视频,防患于未然
  • 基于 Transformer robert的情感分类任务实践总结之二——R-Drop
  • altium designer2024绘制stm32过程笔记x`
  • WebRTC通话原理与入门难度实战指南
  • 从零开始制作小程序简单概述
  • Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
  • SDC命令详解:使用set_port_fanout_number命令进行约束
  • AIGC的产品设计演进:从工具到协作者
  • 生成模型从自回归到变分自动编码器
  • 提供MD5解密的网站
  • WaytoAGI东京大会开启AI全球化新对话:技术无国界,合作促创新
  • 虚拟主机都有哪些应用场景?
  • C++11新增重要标准(下)
  • OTF字体包瘦身,保留想要的字
  • 【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作
  • excel中数字不满六位在左侧前面补0的方法
  • python打卡第45天
  • 【自然语言处理】大模型时代的数据标注(主动学习)
  • 如何评估大语言模型效果
  • 机器学习-经典分类模型
  • 微前端 - Module Federation使用完整示例
  • Spring Boot + Thymeleaf 防重复提交