关于线程池,你需要了解这些

简介: 1、 降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。2、 提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,再执行。3、 提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。

线程池参数

1、 降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。

2、 提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,再执行。

3、 提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。

  • corePoolSize 代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后并不会消除,而是一种常驻线程
  • maxinumPoolSize 代表的是最大线程数,它与核心线程数相对应,表示最大允许被创建的线程数,比如当前任务较多,将核心线程数都用完了,还无法满足需求时,此时就会创建新的线程,但是线程池内线程总数不会超过最大线程数
  • keepAliveTime 、 unit 表示超出核心线程数之外的线程的空闲存活时间,也就是核心线程不会消除,但是超出核心线程数的部分线程如果空闲一定的时间则会被消除,我们可以通过setKeepAliveTime 来设置空闲时间
  • workQueue 用来存放待执行的任务,假设我们现在核心线程都已被使用,还有任务进来则全部放入队列,直到整个队列被放满但任务还再持续进入则会开始创建新的线程
  • ThreadFactory 实际上是一个线程工厂,用来生产线程执行任务。我们可以选择使用默认的创建工厂,产生的线程都在同一个组内,拥有相同的优先级,且都不是守护线程。当然我们也可以选择自定义线程工厂,一般我们会根据业务来制定不同的线程工厂
  • Handler 任务拒绝策略,有两种情况,第一种是当我们调用 shutdown 等方法关闭线程池后,这时候即使线程池内部还有没执行完的任务正在执行,但是由于线程池已经关闭,我们再继续想线程池提交任务就会遭到拒绝。另一种情况就是当达到最大线程数,线程池已经没有能力继续处理新提交的任务时,便会拒绝

线程池中阻塞队列的作用

1、 一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务。

阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源。

阻塞队列自带阻塞和唤醒的功能,不需要额外处理,无任务执行时,线程池利用阻塞队列的take方法挂起,从而维持核心线程的存活、不至于一直占用cpu资源

2、 在创建新线程的时候,是要获取全局锁的,这个时候其它的就得阻塞,影响了整体效率。

就好比一个企业里面有10个(core)正式工的名额,最多招10个正式工,要是任务超过正式工人数(task > core)的情况下,工厂领导(线程池)不是首先扩招工人,还是这10人,但是任务可以稍微积压一下,即先放到队列去(代价低)。10个正式工慢慢干,迟早会干完的,要是任务还在继续增加,超过正式工的加班忍耐极限了(队列满了),就的招外包帮忙了(注意是临时工)要是正式工加上外包还是不能完成任务,那新来的任务就会被领导拒绝了(线程池的拒绝策略)。

线程复用

1、 线程池将线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。

2、 在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 来创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不停检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的 run 方法,将 run 方法当成一个普通的方法执行,通过这种方式只使用固定的线程就将所有任务的 run 方法串联起来。

相关文章
|
前端开发 测试技术 持续交付
云效平台介绍
云效,创立于2012年,是由阿里巴巴出品,是业内领先的面向企业的一站式研发效能平台,以提升研发效能为目标,通过线上化,透明化和自动化打通产品质量闭环,真正实现了持续集成持续交付。
10030 14
|
SQL 关系型数据库 数据处理
实时计算 Flink版产品使用问题之使用的是JsonDebeziumDeserializationSchema,如何更改时区
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
JavaScript 前端开发
vue-loader是什么?使用它的用途有哪些?怎么使用?
vue-loader是什么?使用它的用途有哪些?怎么使用?
218 0
|
数据采集 安全 数据处理
CPCI(CompactPCI)简介
CPCI(CompactPCI)简介
3587 0
CPCI(CompactPCI)简介
|
运维 对象存储
《OSS运维基础实战手册》电子版地址
《OSS运维基础实战手册》帮你轻松解决!本书透彻解析OSS核心概念,十二心法打开全新运维视角,力求帮助云运维工程师们打破能力上升瓶颈。
176 0
《OSS运维基础实战手册》电子版地址
|
网络协议 算法 安全
MQTT.fx接入物联网平台使用说明
通过MQTT.fx工具快速接入阿里云物联网平台
6170 0
MQTT.fx接入物联网平台使用说明
|
机器学习/深度学习 人工智能 供应链
策略篇2:货品运营怎么做? 基于数据智能的货品运营产品Quick Stock | 《零售数据中台通关指南》
本篇介绍了针对数字化应用方向的未来蓝图和阿里云端到端的智能货品解决方案(Quick Stock),包括从选址/选品,新品创新,需求预测/库存计划/供应链执行等。
策略篇2:货品运营怎么做? 基于数据智能的货品运营产品Quick Stock  | 《零售数据中台通关指南》
|
数据中心
数据中心起火常见原因
数据中心设备众多,功率大、耗电量大;机房线缆多、布线复杂,这些都是数据中心容发生火灾隐患的原因。数据中心常见引发火灾的故障有以下几种:01UPS的电池着火电池着火后,烟雾迅速蔓延整个机房(严格意义来说UPS电池不能和机房的设备在一起,但是很多单位因经费和空间限制而放在了一起),即使是不在一个机房,因通道连通,烟雾也会迅速占领机房。