专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

面试被问到线程池是怎样实现线程复用的,如何回答?

  如果你只知道线程池的几个参数,面试被问到再深一点的内容就回答不上来了,那么本系列文章带你熟悉线程池源码,更深入的了解线程池。
  ThreadPoolExecutor将分几篇文章做解析,本文是第二篇,第一篇请见Java线程池只知道几个参数?来看看源码你就清楚了(一),关注一波,不错过后续内容,下面是核心知识点。本篇文章讲解Worker类、runWorker()、getTask()
  一、Worker类详解
  1。Worker类图
  Worker是ThreadPoolExecutor的内部类,根据类图可以看出Worker继承了
  AbstractQueuedSynchronizer类,实现了Runnable接口,也就是说,他本身就相当于一个同步队列,结合他的成员变量thread和firstTask,可以知道他实际上就是我们线程池中所说的线程。除了父类AQS本身提供的独占锁以外,Worker还提供了一些检查任务线程运行状态以及中断线程相关的方法。
  此外,线程池中还有一个工作队列workers,用于保存当前全部的Worker:privatefinalHashSetWorkerworkersnewHashSetWorker();
  2。Worker类源码
  本质上,Worker类既是一个同步组件,也是一个执行任务的线程。所以如果有人问你线程池的线程是怎么包装的,至少我们现在知道有个Worker来包装而不是简单的Thread。下面分析下Worker源码:privatefinalclassWorkerextendsAbstractQueuedSynchronizerimplementsRunnable{工作线程finalThreadthread;初始任务,只在worker第一次执行任务的时候执行,之后都是从workQueue中获取任务执行RunnablefirstTask;线程执行过的任务数volatilelongcompletedTasks;Worker类的构造方法,初始化任务并调用线程工厂创建执行任务的线程Worker(RunnablefirstTask){setState(1);调用runWorker()前禁止中断this。firstTaskfirstTask;this。threadgetThreadFactory()。newThread(this);}重写Runnable接口的run()方法publicvoidrun(){调用ThreadPoolExecutor类的runWorker(Worker)方法runWorker(this);}。。。。。。}
  在Worker类的构造方法中,首先将同步状态state设置为1,为了防止runWorker方法运行之前被中断。这是因为如果其他线程调用线程池的shutdownNow()方法时,如果Worker类中的state状态的值大于0,则会中断线程,如果state状态的值为1,则不会中断线程。
  Worker实现了Runable接口,在调用start()方法后,实际执行的是run方法,里面又调用了ThreadPoolExecutor的runWorker()方法。下面我们来看看这个runWorker方法,知道线程池的线程是如何运行的。二、runWorker()方法分析finalvoidrunWorker(Workerw){ThreadwtThread。currentThread();Runnabletaskw。firstTask;w。firstTasknull;w。unlock();新创建Worker时默认state为1,AQS的unlock方法会将其改为0,此后允许使用interruptIfStarted()方法进行中断完成任务以后是否需要移除当前Worker,即当前任务是否意外退出booleancompletedAbruptlytrue;try{循环获取任务,后面解析getTask方法while(task!null(taskgetTask())!null){加锁,防止shundown时中断正在运行的任务w。lock();如果线程池状态为STOP或更后面的状态,中断线程任务if((runStateAtLeast(ctl。get(),STOP)(Thread。interrupted()runStateAtLeast(ctl。get(),STOP)))!wt。isInterrupted())wt。interrupt();try{钩子方法,默认空实现,可以自己重写beforeExecute(wt,task);Throwablethrownnull;try{执行任务task。run();}catch(RuntimeExceptionx){thrownx;throwx;}catch(Errorx){thrownx;throwx;}catch(Throwablex){thrownx;thrownewError(x);}finally{钩子方法afterExecute(task,thrown);}}finally{tasknull;任务执行完毕,完成数量1w。completedTasks;w。unlock();}}completedAbruptlyfalse;}finally{根据completedAbruptly决定是否要移除意外退出的Worker,并补充新的Worker也就是说,如果上述过程顺利完成,工作线程没有挂掉,就不删除,下次继续用,否则就在workers中remove掉,然后再调用addWorker()方法添加。另外如果获取不到任务,getTask返回空,也会清楚该worker,起到回收非核心线程的目的processWorkerExit(w,completedAbruptly);}}
  概括一下runWorker方法的核心逻辑:
  循环调用getTask方法,获取要执行的线程,加锁然后执行任务,如果执行完任务流程,并且没有发生异常导致Worker挂掉,就直接复用Worker(在获取任务的方法getTask()中循环等待任务),如果执行完任务流程后发现发生异常导致Worker挂掉,就从工作队列中移除当前Worker,并且补充一个新的;
  当然getTask方法就是从队列中获取的,来看下:privateRunnablegetTask(){booleantimedOutfalse;Didthelastpoll()timeout?for(;;){intcctl。get();intrsrunStateOf(c);Checkifqueueemptyonlyifnecessary。如果线程池关闭了,且队列里的任务都完成了,或者线程池进入了比STOP更大的状态,就不表示没有新任务if(rsSHUTDOWN(rsSTOPworkQueue。isEmpty())){decrementWorkerCount();returnnull;}获取当前工作线程数intwcworkerCountOf(c);时候设置了核心线程超时(默认false)或当前线程数大于核心线程数,及存在非核心线程,即判断当前当前是否需要进行超时控制booleantimedallowCoreThreadTimeOutwccorePoolSize;如果线程池中的线程数量大于corePoolSize获取大于corePoolSize或者是否正在等待执行任务并且轮询超时并且当前线程池中的线程数量大于1或者任务队列为空if((wcmaximumPoolSize(timedtimedOut))(wc1workQueue。isEmpty())){成功减少线程池中的工作线程数量if(compareAndDecrementWorkerCount(c))returnnull;continue;}try{阻塞获取任务Runnablertimed?阻塞keepaliveTime以获取任务,如果在keepaliveTime时间内没有获取到任务,则返回null。workQueue。poll(keepAliveTime,TimeUnit。NANOSECONDS):workQueue。take();if(r!null)returnr;如果获取不到任务,说明非核心线程超时了,下一轮判断确认是否退出循环。退出循环后,runWorker方法执行完毕,会被processWorkerExit回收timedOuttrue;}catch(InterruptedExceptionretry){timedOutfalse;}}}
  概括一下getTask方法:
  判断线程池是否关闭,工作队列是否为空,如果是说明没任务了,直接返回null,否则接着往下判断,判断当前是否存在非核心线程,如果是说明需要进行超时处理,获取任务,如果不需要超时处理,则直接从任务队列获取任务,否则根据keepaliveTime阻塞一段时间后获取任务,如果获取不到,说明非核心线程超时,返回null交给runWorker()中的processWorkerExit()方法去删除。
  换句话说,runWorker()方法一旦执行完毕(非核心线程),必然会删除当前的Worker,而通过getTask()拿任务的Worker(核心线程),在线程池正常运行的状态下,核心线程只会一直在for循环中等待直到拿到任务,而非核心线程超时以后拿不到任务就会返回一个null,然后回到runWorker()中走完processWorkerExit()方法被删除。三、Worker类总结
  看了runWorker和getTask方法后,不知道你对这个Worker有没有进一步理解,那么这个Worker充当了什么作用呢,总结一下:
  1。封装线程,将线程进行包装,与线程池的状态做关联。
  2。通过worker达到线程复用的目的,while循环从队列中获取任务,达到核心线程一直运行,非核心线程运行有过期时间的目的,并且worker数量具有自我恢复能力(其实是重新创建worker),保证线程数量。
  这篇就到这,后续文章会继续分析线程池的其他内容。
  如果你觉得此文对你有一丁点帮助,点个赞,关个注,不失联,还希望补充什么内容,大家在评论区留言,期待后续精彩内容。
  微信搜索关注订阅号:马老司,学习更多技术点

格局未定的光伏行业11月财经新势力Hello,大家好,前两期节目都是跟大家介绍了风电这个行业。这其实是传达了我目前的主要思路,在目前的内外部环境下,有趋势性长期性机会的行业其实并不太多。而对于能源应工行中行邮储提供逾1500亿元授信支持碧桂园股价大涨逾2111月24日,碧桂园控股有限公司与中国工商银行股份有限公司中国银行股份有限公司中国邮政储蓄银行股份有限公司分别签署战略合作协议,深化银企合作。根据协议,碧桂园共获得三家银行逾150德罗赞教练此前向我们提出挑战我们不能辜负他北京时间11月24日,今日公牛客场挑战雄鹿。全场战罢,公牛118113战胜雄鹿。赛后,公牛后卫德玛尔德罗赞接受了采访。德罗赞说道教练在几场比赛前向我扎克(拉文)和武切维奇提出挑战。首航高科收关注函深交所要求回应每经此前调查报道的相关问题每经记者范芊芊每经编辑梁枭今日(11月24日),首航高科(SZ002665,股价3。77元,市值95。71亿元)收到深交所关注函,直指公司预付款项相关问题。深交所在关注函中对首航高美国施压盟友强化对俄制裁俄乌冲突爆发以来,美国及其盟友对俄罗斯发起了多轮制裁,但制裁是把双刃剑,尤其是欧洲,在制裁俄罗斯的同时,自身也深陷能源和通胀危机。面对盟友出现的制裁松动迹象,美国正在加大向盟友的施英雄地质队在祖国山河间敲出金色回响央视网消息(新闻联播)山东省地质矿产勘查开发局第六地质大队成立于1958年,建队60多年来,在黄金等矿产资源勘查上不断突破,是全国探明金矿最多的地质队。如今,六队的青年地质工作者们投资10万养羊,7年过去了,到底赚了多少?江艳说了实话我是鄂尔多斯高原上的牧民也是一名养殖户,养羊是我赖以生存的来源今天把我这些年养殖走过的路分享给一些新手或者有从事这个行业意愿的朋友2015年我走进了这个行业,不是因为爱好,也不是因阿媒输球后阿根廷进行了一次自发的会议,球员想扭转现在的形势直播吧11月24日讯世界杯小组赛首轮,阿根廷爆冷12输给沙特。TYC记者GastnEdul发文,表示在输球后球队进行了一次自发的谈话。球员们想要扭转目前的形势,并用行动证明梅西的话与中企敲定13。67亿合约!美国加购中国试剂盒,累计下单额超94亿美国再追加中国试剂盒大单,世卫组织给中企开白名单,新冠自测的海外市场火爆继续11月23日,九安医疗官方发布公告称,与美国国防部后勤局签订了iHealth试剂盒产品的采购合同,合计金V观财报中芯集成IPO月亏过亿拟募125亿,招股书提及中芯国际200多次中新经纬11月23日电(邓芷若)近日,上交所披露公告称,绍兴中芯集成电路制造股份有限公司(下称中芯集成)将于11月25日科创板首发上会。中芯集成的第二大股东是晶圆代工龙头公司中芯国(财经行情)人民币市场汇价(11月24日)新华社北京11月24日电中国外汇交易中心11月24日受权公布人民币对美元欧元日元港元英镑澳元新西兰元新加坡元瑞士法郎加元林吉特卢布兰特韩元迪拉姆里亚尔福林兹罗提丹麦克朗瑞典克朗挪威
一战封神,绝杀,五万分先生北京时间3月3日晚上,在CBA常规赛第30轮的比赛,也就是第三阶段恢复主客场赛制的第二场比赛中,吉林东北虎107比105战胜了上海大鲨鱼队,吉林外援琼斯完成了中投绝杀。本场比赛,多胡荣华提出和棋黑胜是否合理?为什么遭到王天一柳大华反对?在刚刚结束的鹏程杯全国象棋排位赛上,王天一再次夺得冠军,一扫五羊杯小组未出线的阴霾。从网络上流传的一段采访视频看,素有东方电脑之称的柳大华特大表示,在鹏程杯上,主办方接受了他的建议新一期中国女篮树帜四川女篮6人入选为备战今年6月举行的2023年女篮亚洲杯9月举行的杭州亚运会赛事,中国篮协今天公布新一期中国女篮大名单。从27人名单中看,内蒙古和四川女篮两队共入选了13人,占据了半壁江山,其中四巴腾主帅没看到C罗的比赛影响力第一次碰到职业联赛12分钟补时被补时时长气笑的巴腾主帅直播吧3月4日讯沙特联赛第19轮,利雅得胜利31逆转副班长巴腾,继续排名积分榜榜首。本场比赛,补时达到12分钟,利雅得胜利也是在12分钟内连进3球赢得比赛,李月汝被中国女篮征召,恐难前往芝加哥天空队报到,WNBA梦碎为了备战2023年女篮亚洲杯和亚运会,中国篮协发布了最新一期中国女篮的集训名单,中国女篮准备于2023年3月30日5月24日在清远新世纪篮球训练基地进行集训选拔。本次集训共有27名如何洗发才能让你头发不脱发?如何洗头相信大家都会说,谁不会洗头。但要真正正确洗好头发还是需要一定的时间和耐心。我们店里很多保养头发的顾客们,问他们在家怎么洗头的,一般洗多久?他们都会说洗头洗澡一起10分钟,洗湿气最怕喝这碗汤,给家人喝这汤,健脾祛湿,全身都轻松春耕进行时送走二月份,我们迎来三月份,正值今年的早春,春季是万物复苏的时候,春暖花开,气温开始不断地回升,很多沿海和沿江城市,空气里的水分很多,导致体内的湿气很重,严重影响到我们身春困不能光睡觉祛湿升阳动起来春天来了,有点春困?中医专家告诉你,解决春困不是靠多睡觉,而应该祛湿升阳气,适当动起来!为何春困?多因脾虚湿困为何天气潮湿会令人感觉春困?广东省中医院皮肤科主任医师闫玉红解释,当空女排欧冠四分之一决赛对阵出炉!土意8强占6席,中国名将遗憾出局随着最后两场比赛的结束,23年女排欧冠八强和四分之一决赛对阵形势随之出炉,晋级八强的队伍分别是瓦基弗银行米兰蒙扎费内巴切科内利亚诺斯图加特诺瓦拉热舒夫和伊萨奇巴希。从八强名单来看,优秀作文推荐我与青春斗智斗勇严冬不严我与青春斗智斗勇马路上的车很多,有的载着生活的,有的载着快乐,有的载着希望,唯独我载着迷茫与失落。我时常问自己为何活着,又何尝不想好好活着。每个人的一生都是精彩的,十几岁的年龄好像当心!孩子体重超标5斤,骨龄会加速发育,身高会提前封顶孩子体重超标5斤,骨龄会加速发育,孩子容易提前结束长。嗨!大家好!我是美妈很帅,这期我们来说说体重是怎么影响长高的,孩子每年增重多少有利于长高,怎么做能够延缓骨龄生长,帮孩子争取到
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网