线程池学习心得帮助快速面试

前言

 源码方面的面试,我理解主要有两点。第一就是整体思路,对于目标源码的理解。是什么,为什么,干什么,怎么用 组合拳打一通。 第二就是精髓地方,也就是哪些地方设计得好,为什么好,什么时候可以借鉴、借鉴什么。

1、整体思路(线程池两个维度的两大流程)

1.1 接收到任务之后任务流程。一个任务怎么被线程池执行完毕:

开始

1.1.1 主线程调用线程池

1.1.2 线程池添加工作线程(addworker(task)方法传入任务 构建worker对象)

1.1.3 worker对象启动线程 (调用worker run()方法,本质是调用线程的run方法执行任务)

1.1.4 调用循环调用runworker()传入的任务不为空这里直接干完了任务

1.1.5 传入的方法为空就要去调用getTask()取队列里面拿任务(核心线程使用take方法(死等),非核心线程用poll方法(超时就退出))

1.1.6 拿到任务执行完之后,继续循环1.1.4

1.2 接收到任务之后线程流程。线程的生命周期,以及怎么干活:

1.2.1 添加一个核心线程来干活,成功则执行1.1.2(核心线程不设置失效的话,就永远存在了,一直循环用take方法死等任务然后执行)。添加的话失败往下走

1.2.2 添加到任务队列,成功需要判断工作线程个数,为0的话需要添加一个非核心线程干活(例如核心线程数设置为0),添加的话失败往下走

1.2.3 添加一个非核心线程,成功则执行1.1.2(非核心线程,一直循环用poll方法等任务然后执行,超时则退出)。添加的话失败往下走

1.2.4 使用拒绝策略(1、报错,2、丢老的,3、丢新的,4、调用线程处理)

2、线程池设计的精妙点:

1、ctl变量前三位保存线程池状态,后29位记录线程个数,volatile修饰,更改的时候使用使用cas锁

2、worker对象设计,包含一个线程,用来管理线程的生命周期以及属性。调用方使用worker对象的run方法,实际是异步使用线程的run方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值