ThreadPoolExecutor:
参数:核心线程数,最大线程数,线程存活时间,存活时间单位,工作队列,线程工厂,拒绝策略。
运行过程:
1)提交任务时,若此时线程数小于核心数,则创建新线程并运行任务;
2)若此时线程数等于核心数,则将任务放在队列中
3)若队列满了,若当前线程数小于最大线程数,则创建新线程并运行。
4)若队列满了,并且线程数等于最大线程数,则进行拒绝策略。

拒绝策略:
1)AbortPolicy:直接抛出异常
2)DiscardPolicy:放弃当前任务,并且不抛出异常
3)DiscardOldestPolicy:移除队列中添加最早的元素,并尝试添加。
4)CallerRunsPolicy:调用主线程执行任务。

ThreadLocal:
ThreadLocal相互隔离,实质上是存在Tread中的ThreadLocals里,ThreadLocal作为key的map类型。使用结束后要调remove,否则可能造成内存泄漏。因为key是弱引用只能活到下次GC开始,目的是和线程生命周期解绑,但如果key为静态变量,则可能造成内存泄漏。

AQS:
AbstractQueuedSynchronizer抽象类,是JUC下的一个基类,很多内容都是基于AQS实现了部分功能,ThreadPoolExecutor,ReentrantLock。
1)提供了一个由volatile修饰,采用CAS方式修改的int类型state变量,用于记录资源
2)维护了一个双向链表,当线程没拿到锁资源,则封装为node,放到AQS中排队,
A)对于有反向遍历需求的场景有用,任意位置插入删除都是O1复杂度,
B)当一个线程出现异常,不再需要竞争锁,要把异常节点删除,
C)加入节点时,需要判断前驱节点状态,为sign状态时,才会阻塞当前线程,
D)当自旋竞争时,需要判断前驱节点是否为头结点,是则自旋,否则阻塞
3)提供了conditionObject类,主要为并发编程的同步提供了等待通知的实现方法,通 过一个等待队列来维护条线等待的线程

最后修改:2022 年 10 月 13 日
如果觉得我的文章对你有用,请随意赞赏