- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
第
Java线程池ThreadPoolExecutor源码解析
privatefinalAtomicIntegerctl=newAtomicInteger(ctlOf(RUNNING,0));
privatestaticfinalintCOUNT_BITS=Integer.SIZE-3;
privatestaticfinalintCAPACITY=(1COUNT_BITS)-1;
//runStateisstoredinthehigh-orderbits
privatestaticfinalintRUNNING=-1COUNT_BITS;
privatestaticfinalintSHUTDOWN=0COUNT_BITS;
privatestaticfinalintSTOP=1COUNT_BITS;
privatestaticfinalintTIDYING=2COUNT_BITS;
privatestaticfinalintTERMINATED=3COUNT_BITS;
//Packingandunpackingctl
privatestaticintrunStateOf(intc){returnc~CAPACITY;}
privatestaticintworkerCountOf(intc){returncCAPACITY;}
privatestaticintctlOf(intrs,intwc){returnrs|wc;}
先声明线程池的五种状态,再看其他字段方法具体执行了其他什么操作
RUNNING:-1COUNT_BITS,即高3位为111
SHUTDOWN:0COUNT_BITS,即高3位为000
STOP:1COUNT_BITS,即高3位为001
TIDYING:2COUNT_BITS,即高3位为010
TERMINATED:3COUNT_BITS,即高3位为011
至于其每种空置状态的具体意义,根据英文释义结合代码具体理解,而非直接理解,通过位移位的操作将高3位与低29位分离开来,高三位表示此时整个线程池的运行状态,低29位表示线程池中线程的数量,再去看execute执行过程即可.
intc=ctl.get();
if(workerCountOf(c)corePoolSize){
if(addWorker(command,true))
return;
c=ctl.get();
用于获取此时线程中的线程数,如果小于核心线程数,就添加任务,添加任务成功则返回,失败则重新获取控制字段,addworker后续了解,复杂的东西简单化,理解大致操作思想最为核心.
if(isRunning(c)workQueue.offer(command)){
intrecheck=ctl.get();
if(!isRunning(recheck)remove(command))
reject(command);
elseif(workerCountOf(recheck)==0)
addWorker(null,false);
根据控制字段c去判断线程池的运行状态是否正在运行,如果添加任务成功则不会执行失败,或者说此时线程数有可能已经大于了核心线程数也有可能走到这,所以会将任务添加到阻塞队列中去,然后重新去获得控制字段,再去做校验,如果此时线程池不是正在运行的状态并且删除任务成功,这一步主要是为了防止阻塞队列添加任务成功这个过程,可能线程池不运行了,那么这时候就需要将添加的那个任务删除,并对他执行拒绝策略,又或者是此时线程池中的线程数已经为0,说明没有线程在工作了,因此添加一个空任务,至于第二个参数在addWorker中在做说明
elseif(!addWorker(command,false))
reject(command);
字面意思就是添加任务失败,执行拒绝策略,则是为了应对线程池已经到了满负载的状态
您可能关注的文档
最近下载
- 2025人教版道法七年级下册《第四单元 生活在法治社会》大单元整体教学设计[2022课标].pdf
- JT∕T 1134-2017 -道路客货运输驾驶员行车操作规范.pdf VIP
- 入职简历模板.pdf VIP
- 中国艾滋病诊疗指南(2024版).pptx VIP
- 国家建筑标准图集-10MR204 城市道路—透水人行道铺设.pdf VIP
- 注音童话故事——小鲤鱼跳龙门.pdf VIP
- 《城市更新的》课件.ppt VIP
- GB_T 43021-2023 电子组装件焊接的返工、改装和返修工艺要求.pdf VIP
- TB 10303-2020铁路桥涵工程施工安全技术规程.docx VIP
- 2022年江苏南京教师招聘考试真题.docx VIP
文档评论(0)