欢迎光临散文网 会员登陆 & 注册

源码专栏-ThreadPoolExecutor

2023-03-05 09:44 作者:nickHHH233  | 我要投稿
  1. ctl状态为什么要用 移位运算 -1 << COUNT_BITS; ctl这个AtomicInteger类型,是对线程池的运行状态和线程池中有效线程的数量进行控制的一个字段, 它同时包含两部分的信息:线程池的运行状态 (runState) 和线程池内有效线程的数量 (workerCount),高3位保存runState,低29位保存workerCount,两个变量之间互不干扰。用一个变量去存储两个值,可避免在做相关决策时,出现不一致的情况,不必为了维护两者的一致,而占用锁资源。通过阅读线程池源代码也可以发现,经常出现要同时判断线程池运行状态和线程数量的情况。线程池也提供了若干方法去供用户获得线程池当前的运行状态、线程个数。这里都使用的是位运算的方式,相比于基本运算,速度也会快很多。

  2. private static int workerCountOf(int c) { return c & CAPACITY; } 直接ctl设置1、2、3 然后返回变量不行吗

  3. 如果有异常怎么处理 分情况 如果是submit提交任务的会被FutureTask吞掉,如果是execute提交的会抛出异常,同时会进行异常work退出处理,先从works移掉当前的work,然后创建一个新的works

  4. 数量怎么统计呢,线程池没有专门变量去存储当前最大核心数,最大线程数,都是用一个变量ctl来获取当前线程数

  5. 美团是怎么获取到当前的最大核心线程池数的?最大线程池数,这个没意义啊,如果要改变核心线程数,直接通过setCorePoolSize来设置就好了,这个会比较当前线程池数是否小于刚刚设置的核心线程数,如果小于for循环创建work,如果大于则中断,只是中断并没有减少work,美团是怎么实现的??

  6. showdown和showdonwNow有什么区别 生产上一般使用showdownNow,showdownNow会处理当前还在工作队列的任务,处理完后才关闭,但showdown不会直接关闭所有线程,情况工作队列

  1. 怎么处理空闲线程,调整状态,每个线程执行时都会再一个死循环里面遍历工作队列,判断当前线程数是否小于核心线程数,如果小于则表示目前所有的都是核心线程,那么通过阻塞队列take方法阻塞直到有新的任务,如果大于核心线程数,并且设置存活时间,通过poll只要从队列获取任务超过这个存活时间还没有获取到任务,就会进入processWorkerExit来调整状态,减少work数量,然后判断当前线程数是否小于核心线程数,如果小于则增加work,如果大于则不管跳过

这篇文章写的不错,可以多看看 https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html

相关面试题 https://mp.weixin.qq.com/s/AVtbsVwNH97goImfUDaouw

本文使用 文章同步助手 同步

源码专栏-ThreadPoolExecutor的评论 (共 条)

分享到微博请遵守国家法律