线程池七个重要参数以及工作流程

线程池是一种线程使用模式,能有效管理线程的创建和销毁,减少资源消耗。其重要参数包括核心线程数、最大线程数、存活时间等。当线程池饱和时,会执行拒绝策略,如抛弃任务或抛出异常。线程池的工作流程涉及任务的提交、线程的创建与复用以及任务队列的管理。
摘要由CSDN通过智能技术生成

1、什么是线程池

从字面上理解它就是一个管理线程的池子。

  • 它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是需要资源开销的。
  • 提高响应速度。 如果任务到达了,相对于从线程池拿线程,重新去创建一条线程执行,速度肯定慢很多。
  • 重复利用。 线程用完,再放回池子,可以达到重复利用的效果,节省资源。

2、线程池的作用

线程创建是需要时间的,如果每次使用新线程的时候,都去创建线程,是比较耗时的。但是如果将线程先创建好,放到池子里面,用的时候直接从池子里面去取,就省略了创建线程的时间。(用空间来换取时间)

架构调优:要么牺牲空间,来换取时间(池化思想,缓存);要么牺牲时间,来换取空间

3、重要参数

  1. 核心线程数(corePoolSize):当线程池的线程都忙碌时,再进来新任务时,由最小线程数扩容到核心线程数 。一般设置为cpu的核数

  2. 最大线程数 (maximumPoolSize):当核心线程数满了,当队列也满了,再来新任务,就会创建新非核心线程来执行这个新任务,直到线程数达到最大线程数。一般设置为cpu的核数*2

  3. 存活时间(keepAliveTime):非核心线程 =(maximumPoolSize - corePoolSize ) ,非核心线程闲置下来不干活最多存活时间。当非核心线程超过多长时间不执行任务,处于空闲状态,线程池会将它回收,直到线程数量达到核心线程数。如果设置为0,就代表不回收

  4. 存活时间单位(unit):线程池中非核心线程保持存活的时间的单位

TimeUnit.DAYS; 天
TimeUnit.HOURS; 小时
TimeUnit.MINUTES; 分钟
TimeUnit.SECONDS; 秒
TimeUnit.MILLISECONDS; 毫秒
TimeUnit.MICROSECONDS; 微秒
TimeUnit.NANOSECONDS; 纳秒

  1. 线程池等待队列(workQueue):维护着等待执行的Runnable对象。当运行当线程数= corePoolSize时,新的任务会被添加到workQueue中,如果workQueue也满了则尝试用非核心线程执行任务,等待队列应该尽量用有界的。
  2. threadFactory
    创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等。
  3. handler
    corePoolSize、workQueue、maximumPoolSize都不可用的时候执行的饱和策略

4、饱和拒绝策略有哪些?

饱和拒绝策略:如果说线程数达到最大线程数,并且队列也满了,就要执行饱和策略。

  1. AbortPolicy :直接抛出异常(默认使用此策略),告诉开发这个任务线程池执行不了,由开发来决定是否丢弃

  2. DiscardPolicy : 丢弃当前任务

  3. DiscardOldestPolicy:丢弃阻塞队列里最老的任务,也就是最先进入队列的任务。

  4. 用调用者所在的线程来执行任务

一般情况下,前三种都会有丢弃任务的风险,但是性能都比较好
第4种最稳妥

5、线程池工作流程

  1. 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。
  2. 当调用 execute() 方法添加一个任务时,线程池会做如下判断:
  • 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
  • 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;
  • 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
  • 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会根据饱和拒绝策略来对应处理。
  1. 当一个线程完成任务时,它会从队列中取下一个任务来执行。

  2. 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值