线程池与锁
文章平均质量分 92
牤牛上的虻
这个作者很懒,什么都没留下…
展开
-
ThreadPoolExecutor逻辑链梳理 - 5 Worker的Runnable属性
Thread和Worker都是Runnable的实现类,在线程池中Worker的run方法通过addWorker方法在Thread::run方法中启动,而Thread::run方法是通过Thread::start方法通过jvm启动Worker构造时AQS的state为-1,在runWorker方法中首先解锁成为0,然后加锁成为1,在abortPolicy中输出的是即state非0的数量原创 2024-02-23 15:43:34 · 1219 阅读 · 0 评论 -
ThreadPoolExecutor逻辑链梳理 - 4 Worker的AQS属性
Worker继承AQS同时实现了Runnable接口,本质上是一个带锁的可执行对象。Worker的state有-1、0、1三种状态,而线程池对于Worker的统计,active worker数量实际是state为0的状态Worker是一个不可重入锁,实现了锁相关的tryAcquire和tryRelease方法。原创 2024-02-18 15:45:09 · 670 阅读 · 0 评论 -
ThreadPoolExecutor逻辑链梳理 - 3 核心线程池与非核心线程池的添加流程
addWorker方法是将传入的Runnable对象封装成Worker,将任务启动的工作委托给Worker执行,同时通过一些列方法对Worker的状况进行统计。线程池中没有真正意义上的核心线程池和非核心线程池的概念,实际上是通过workCount与哪一个值(corePoolSize还是maximumPoolSize)的比较,最终决定加还是不加。本质上所有的thread都是一样的。原创 2024-02-17 15:02:42 · 1126 阅读 · 0 评论 -
ThreadPoolExecutor逻辑链梳理 - 2 拒绝处理机制
【从问题开始】在使用线程池的时候往往会看到线程池reject相关日志,例如以下日志:遂产生疑问:为什么线程池大小为80,队列长度为3的线程池,只有3个active threads就会触发reject机制?本篇就问题1探寻线程池的拒绝策略。原创 2024-02-06 14:33:19 · 877 阅读 · 1 评论 -
ThreadPoolExecutor逻辑链梳理 - 1 线程池的执行入口
线程池的提交方法 - execute方法执行的流程是:核心线程池 - 阻塞队列 - 非核心线程池reject策略的触发点是:存入阻塞队列,触发于线程池状态变为非RUNNING状态并成功执行了任务移除流程添加非核心线程池失败原创 2024-02-05 16:48:45 · 345 阅读 · 2 评论