Java线程池ThreadPoolExecutor源码解析.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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);

字面意思就是添加任务失败,执行拒绝策略,则是为了应对线程池已经到了满负载的状态

文档评论(0)

139****7676 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档