游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

java线程池的深入了解1

  ThreadPoolExecutor先抛出几个问题线程池参数有哪些都是什么意思线程池状态线程池如何保证核心线程不死亡线程池执行过程线程池有什么好处常见的线程池以及使用场景
  直接上最简单是使用实例publicstaticvoidmain(String〔〕args){BlockingQueueRunnableblockingQueuenewArrayBlockingQueue(10);ThreadFactorypoolNamenewThreadFactoryBuilder()。setNameFormat(handsameguyd)。build();ThreadPoolExecutorexecutornewThreadPoolExecutor(2,5,1,TimeUnit。MINUTES,blockingQueue,poolName);开心的话这里可以加一个循环,里面做一个随机休眠executor。execute((){System。out。println(早上起来不要照镜子,不然会被自己帅死);});}早上起来不要照镜子,不然会被自己帅死二话不说直接看源码构造
  先看构造:其实比较简单就是构造一些属性Createsanew{codeThreadPoolExecutor}withthegiveninitialparameters。paramcorePoolSizethenumberofthreadstokeepinthepool,eveniftheyareidle,unless{codeallowCoreThreadTimeOut}issetparammaximumPoolSizethemaximumnumberofthreadstoallowinthepoolparamkeepAliveTimewhenthenumberofthreadsisgreaterthanthecore,thisisthemaximumtimethatexcessidlethreadswillwaitfornewtasksbeforeterminating。paramunitthetimeunitforthe{codekeepAliveTime}argumentparamworkQueuethequeuetouseforholdingtasksbeforetheyareexecuted。Thisqueuewillholdonlythe{codeRunnable}taskssubmittedbythe{codeexecute}method。paramthreadFactorythefactorytousewhentheexecutorcreatesanewthreadparamhandlerthehandlertousewhenexecutionisblockedbecausethethreadboundsandqueuecapacitiesarereachedthrowsIllegalArgumentExceptionifoneofthefollowingholds:
  {codecorePoolSize0}
  {codekeepAliveTime0}
  {codemaximumPoolSize0}
  {codemaximumPoolSizecorePoolSize}throwsNullPointerExceptionif{codeworkQueue}or{codethreadFactory}or{codehandler}isnullcorePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime空闲线程的最大超时时间unit超时时间的单位workQueue工作队列,保存未执行的Runnable任务threadFactory创建线程的工厂类handler拒绝策略publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueRunnableworkQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler){if(corePoolSize0maximumPoolSize0maximumPoolSizecorePoolSizekeepAliveTime0)thrownewIllegalArgumentException();if(workQueuenullthreadFactorynullhandlernull)thrownewNullPointerException();this。corePoolSizecorePoolSize;this。maximumPoolSizemaximumPoolSize;this。workQueueworkQueue;this。keepAliveTimeunit。toNanos(keepAliveTime);this。threadFactorythreadFactory;this。handlerhandler;}执行
  来看执行,执行有2个方法一个是execute()另一个是submit()。先看execute()publicvoidexecute(Runnablecommand){if(commandnull)thrownewNullPointerException();Proceedin3steps:分为3个步骤1。IffewerthancorePoolSizethreadsarerunning,trytostartanewthreadwiththegivencommandasitsfirsttask。ThecalltoaddWorkeratomicallychecksrunStateandworkerCount,andsopreventsfalsealarmsthatwouldaddthreadswhenitshouldnt,byreturningfalse。1、当运行的线程数少于核心线程数的时候,尝试为当前的任务启动一个新的线程。通过调用addWorker自动检查runState和workerCount,防止可能增加的错误警报当它不应该线程,返回false。2。Ifataskcanbesuccessfullyqueued,thenwestillneedtodoublecheckwhetherweshouldhaveaddedathread(becauseexistingonesdiedsincelastchecking)orthatthepoolshutdownsinceentryintothismethod。Sowerecheckstateandifnecessaryrollbacktheenqueuingifstopped,orstartanewthreadiftherearenone。2、如果任务成功的排队,我们仍然需要做双重检查这个线程是否需要被加入。池关闭后进入此方法。所以我们重新检查状态,如果有必要回滚排队停止,或启动一个新线程3。Ifwecannotqueuetask,thenwetrytoaddanewthread。Ifitfails,weknowweareshutdownorsaturatedandsorejectthetask。3、如果新的新城不能排队任务,尝试添加一个新的线程。如果它失败了,关闭或饱和的所以拒绝这个任务。intcctl。get();if(workerCountOf(c)corePoolSize){1、if(addWorker(command,true))return;cctl。get();}2、if(isRunning(c)workQueue。offer(command)){intrecheckctl。get();if(!isRunning(recheck)remove(command))reject(command);elseif(workerCountOf(recheck)0)addWorker(null,false);}3、elseif(!addWorker(command,false))reject(command);}
  addWorker()firstTask任务core是否核心线程privatebooleanaddWorker(RunnablefirstTask,booleancore){1、自旋,确定是否可以创建worker。可以则跳出循环继续操作,否则返回falseretry:for(;;){intcctl。get();intrsrunStateOf(c);Checkifqueueemptyonlyifnecessary。检查线程池状态及队列是否空if(rsSHUTDOWN!(rsSHUTDOWNfirstTasknull!workQueue。isEmpty()))returnfalse;for(;;){intwcworkerCountOf(c);if(wcCAPACITYwc(core?corePoolSize:maximumPoolSize))returnfalse;CAS增长workerCount,成功则跳出循环if(compareAndIncrementWorkerCount(c))breakretry;重新获取ctl,状态改变则继续外层循环,否则在内层循环cctl。get();Rereadctlif(runStateOf(c)!rs)continueretry;elseCASfailedduetoworkerCountchange;retryinnerloop}}2、创建worker,这部分使用ReentrantLock锁booleanworkerStartedfalse;booleanworkerAddedfalse;Workerwnull;try{wnewWorker(firstTask);finalThreadtw。thread;if(t!null){finalReentrantLockmainLockthis。mainLock;mainLock。lock();try{Recheckwhileholdinglock。BackoutonThreadFactoryfailureorifshutdownbeforelockacquired。获取到锁以后仍需要二次检查ctl,上一个获取到锁处理的线程可能会改变runState如ThreadFactory创建失败或线程池被shutdown等intrsrunStateOf(ctl。get());if(rsSHUTDOWN(rsSHUTDOWNfirstTasknull)){if(t。isAlive())precheckthattisstartablethrownewIllegalThreadStateException();加入工作队列workers。add(w);intsworkers。size();if(slargestPoolSize)largestPoolSizes;workerAddedtrue;}}finally{释放锁mainLock。unlock();}启动线程if(workerAdded){t。start();更改标志位workerStartedtrue;}}}finally{启动失败,处理启动失败线程。if(!workerStarted)addWorkerFailed(w);}returnworkerStarted;}
  来看看worker长什么样子。
  Worker是ThreadPoolExecutor的内部类,实现了AQS并继承了Runnable。privatefinalclassWorkerextendsAbstractQueuedSynchronizerimplementsRunnable{Thisclasswillneverbeserialized,butweprovideaserialVersionUIDtosuppressajavacwarning。privatestaticfinallongserialVersionUID6138294804551838833L;Threadthisworkerisrunningin。Nulliffactoryfails。每个worker有自己的内部线程,ThreadFactory创建失败时是nullfinalThreadthread;Initialtasktorun。Possiblynull。RunnablefirstTask;Perthreadtaskcounter完成的任务数volatilelongcompletedTasks;CreateswithgivenfirsttaskandthreadfromThreadFactory。paramfirstTaskthefirsttask(nullifnone)Worker(RunnablefirstTask){inhibitinterruptsuntilrunWorker禁止线程在启动前被打断setState(1);this。firstTaskfirstTask;this。threadgetThreadFactory()。newThread(this);}DelegatesmainrunlooptoouterrunWorkerrun方法publicvoidrun(){runWorker(this);}LockmethodsThevalue0representstheunlockedstate。Thevalue1representsthelockedstate。state0代表未锁;state1代表已锁protectedbooleanisHeldExclusively(){returngetState()!0;}protectedbooleantryAcquire(intunused){if(compareAndSetState(0,1)){setExclusiveOwnerThread(Thread。currentThread());returntrue;}returnfalse;}protectedbooleantryRelease(intunused){setExclusiveOwnerThread(null);setState(0);returntrue;}publicvoidlock(){acquire(1);}publicbooleantryLock(){returntryAcquire(1);}publicvoidunlock(){release(1);}publicbooleanisLocked(){returnisHeldExclusively();}终端启动的线程voidinterruptIfStarted(){Threadt;if(getState()0(tthread)!null!t。isInterrupted()){try{t。interrupt();}catch(SecurityExceptionignore){}}}}
  worker实现了简单的非重入互斥锁。worker实现锁的目的与传统锁的意义不太一样。其主要是为了控制线程是否可中断
  再来看下worker的核心run方法finalvoidrunWorker(Workerw){ThreadwtThread。currentThread();Runnabletaskw。firstTask;w。firstTasknull;w。unlock();allowinterruptsbooleancompletedAbruptlytrue;try{循环直到tasknull(线程池关闭、超时等)注意这里的getTask()方法,我们配置的阻塞队列会在这里起作用while(task!null(taskgetTask())!null){执行前先加锁w。lock();Ifpoolisstopping,ensurethreadisinterrupted;ifnot,ensurethreadisnotinterrupted。ThisrequiresarecheckinsecondcasetodealwithshutdownNowracewhileclearinginterrupt为了确保线程池运行停止的时候线程运行中断,需要在第二种情况下进行重新获取ctlif((runStateAtLeast(ctl。get(),STOP)(Thread。interrupted()runStateAtLeast(ctl。get(),STOP)))!wt。isInterrupted())wt。interrupt();try{beforeExecute(wt,task);Throwablethrownnull;try{执行真正的run方法task。run();}catch(RuntimeExceptionx){thrownx;throwx;}catch(Errorx){thrownx;throwx;}catch(Throwablex){thrownx;thrownewError(x);}finally{afterExecute(task,thrown);}}finally{tasknull;w。completedTasks;w。unlock();}}completedAbruptlyfalse;}finally{线程退出工作processWorkerExit(w,completedAbruptly);}}
  当没有任务的时候runWorker()方法会循环getTask()这个方法可能会阻塞privateRunnablegetTask(){booleantimedOutfalse;Didthelastpoll()timeout?for(;;){intcctl。get();intrsrunStateOf(c);Checkifqueueemptyonlyifnecessary。检查是否还继续处理任务if(rsSHUTDOWN(rsSTOPworkQueue。isEmpty())){decrementWorkerCount();returnnull;}intwcworkerCountOf(c);Areworkerssubjecttoculling?获取是否允许超市booleantimedallowCoreThreadTimeOutwccorePoolSize;if((wcmaximumPoolSize(timedtimedOut))(wc1workQueue。isEmpty())){if(compareAndDecrementWorkerCount(c))returnnull;continue;}try{Runnablertimed?workQueue。poll(keepAliveTime,TimeUnit。NANOSECONDS):workQueue。take();if(r!null)returnr;timedOuttrue;}catch(InterruptedExceptionretry){timedOutfalse;}}}回答疑问线程池参数有哪些都是什么意思corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime空闲线程的最大超时时间unit超时时间的单位workQueue工作队列,保存未执行的Runnable任务threadFactory创建线程的工厂类handler拒绝策略线程池如何保证核心线程不死亡runWorker方法中调用了getTask方法,这个方法会阻塞。线程池执行过程
  线程池有什么好处1、节省资源、提高效率。线程的创建和销毁相对都是比较消耗资源,利用线程池可以在需要的时候直接获取一个线程这样能尽可能的避免了重复的创建和销毁线程。2、方便管理可以编写线程池管理代码对池中的线程统一进行管理,避免因无休止的创建线程导致系统崩溃。线程池状态()RUNNINGSHUTDOWNSTOPTIDYINGTERMINATED
  下面这两个问题算是留尾巴吧,后面再抽时间来看常见的线程池以及使用场景线程池的状态的流转扩展
  在阅读源码的时候其实能看到一些变量定义初始化以及状态的判断都是用位运算判断的。比如不同系统这里可能不一样,这里假设是32privatefinalAtomicIntegerctlnewAtomicInteger(ctlOf(RUNNING,0));线程个数的表示〔位数〕(不同平台int类型范围不一样)不管int是多少位,反正高三位就是表示线程状态,剩余的位数表示线程数量线程数量privatestaticfinalintCOUNTBITSInteger。SIZE3;线程最大数量privatestaticfinalintCAPACITY(1COUNTBITS)1;高三位表示线程池状态运行状态privatestaticfinalintRUNNING1COUNTBITS;privatestaticfinalintSHUTDOWN0COUNTBITS;privatestaticfinalintSTOP1COUNTBITS;privatestaticfinalintTIDYING2COUNTBITS;privatestaticfinalintTERMINATED3COUNTBITS;获取线程池状态privatestaticintrunStateOf(intc){returncCAPACITY;}获取线程池有效线程数量privatestaticintworkerCountOf(intc){returncCAPACITY;}获取上面提到的32位int类型的数值privatestaticintctlOf(intrs,intwc){returnrswc;}
  这里拿RUNNING状态具体,看下具体是怎么算的。RUNNING1COUNTBITS
  这里需要假设一下Integer。SIZE32COUNTBITS29
  那么RUNNING1COUNTBITS表示1二进制左移29位。1的二进制是多少在计算机中,负数以其正值的补码形式表达。补码反码11的源码0000000000000000000000000000000000000000000000000000000000000001反码1111111111111111111111111111111111111111111111111111111111111110补码反码111111111111111111111111111111111111111111111111111111111111111111左移29位溢出位丢弃,空余位补0得到下面的结果1110000000000000000000000000000000000000000000000000000000000000
  因此RUNNING高三位为111,同样方式可计算SHUTDOWN:000STOP:001TIDYING:010TERMINATED:011获取线程池状态privatestaticintrunStateOf(intc){returncCAPACITY;}CAPACITY从上面可以得知为1111111(29bit),取反后就是1110000000(29个0)c上面的结果就可以获取到高三位,而后29位全部为0获取线程池有效线程数量privatestaticintworkerCountOf(intc){returncCAPACITY;}CAPACITY为000111111(29个1)cCAPACITY,就可以获取变量c的低29位的值获取上面提到的32位int类型的数值rs为线程状态,wc表示线程数量privatestaticintctlOf(intrs,intwc){returnrswc;}

夏天的风轻轻吹过而我们,要穿上会呼吸的运动鞋夏日其实很适合运动,也是我们减脂最好的季节。在夏天,最重要的莫过于凉快、清爽。而对于大多数值友来说,因为夏季温度高,我们活动的强度也会明显高于其他季节。那么在炎热的天气里,选择……3D机器视觉检测的100质控,工业安卓一体机来打榜!随着机器视觉和视觉智能方面的研究和技术的不断成熟,使得半导体制造日益进步,图像传感器技术应用领域得以逐渐普及,并降低了视觉系统的成本,这也让其在工业制造中的应用成为了众多企业越……不靠情怀,凭硬实力反超舶来品的国产实战篮球鞋熟悉球鞋的朋友都知道,最近的进口鞋款,越来越平庸了,例如著名的PG4和哈登5,球星签名鞋做成这样,着实让我这种多年老粉有些失望。反观之前一直有些看不上的国产球鞋,每年的进步都非……一种毫无杂质的平静美感,vivoY70s带来冷萃银全新配色今年5月份,vivo发布了一款国民优选5G手机vivoY70s。从潮流的外观设计到至美影像的拍照体验,再到流畅的使用体验,vivoY70s都收获了不错的口碑。目前,viv……家庭健康饮水大升级小米H400G净水器CiaoBello,我是老房。魔都上海的自来水水质相信上海的小伙伴都非常清楚,自来水做的白开水水很难喝。二十多年来自来水饮用的问题围绕着上海城市人民,最初从18L桶装水到……阿里云未来3年再投2000亿4月20日,阿里云宣布未来3年再投2000亿,用于云操作系统、服务器、芯片、网络等重大核心技术研发攻坚和面向未来的数据中心建设。我们对未来有信心,对数字经济有信心。云智能……摄影爱好者的神器,SDExpress7。0读卡设备对于移动存储产品使用者来说,经常会用到U盘,SDTF读卡器等设备,对于摄影爱好者来说,读卡设备也是必不可少的。目前SDExpress高速卡已经上市,而相应的读卡设备却很少。这款……90后女孩不结婚不社交3年怒攒一套别墅作者好房君最近我在豆瓣上围观了一个丧心病狂攒钱小组,组里的话题和它的名字一样,十分硬核。总的来说就是围绕着:攒钱,极致地攒钱!组里有各式各样的打卡挑战,比如某……荣耀智慧屏开机无广告,致敬友商,毫不逊色万元电视双十一作为一个购物狂欢节,很多人都会选择在双十一入手大件家电,毕竟福利多多嘛。而今天这个大件家电则是荣耀智慧屏X2系列。众所周知荣耀是极少数开关机无广告的电视品牌之一,而……国潮经典品牌,西安人带你了解你所不知道的冰峰前言大家好,我是小猴。随着炎炎夏日来临。想必大家每天都会喝上一瓶冰镇凉爽的饮料。作为西安人,夏日冰峰则是必不可少的日常饮料。那么作为一款老牌儿国民饮料,你又对它了解多少呢……简约不简单,杜伽K310机械键盘上手体验前言:学校里学习电脑的时候还是使用的DOS系统,只记得那时的键盘非常重,扣下键帽就是一个十字型的,后来电脑普及了,键盘也越来越轻,打字的时候键盘也会像鼠标一样四处移动了,……解放双肩之ampampquotGPDMicroPCampam有那么一群现场工程师,他们背着老旧的thinkpad穿梭于机房、穿梭于工业现场,为什么是老旧的thinkpad呢,因为老笔记本电脑接口全,可以满足他们的工作需要。有没有一款电脑……
全民理想冰箱实力升级海信真空全金属冰箱牵手拜托了冰箱这个时代,什么最有价值?超出大众预期,不断建构消费者理想生活的产品当然最有价值。今年,被誉为全民理想的海信真空冰箱全新升级,以全金属内胆的高质量,真空头等舱的格调,星河墨……小鹏P5选哪款最划算?对比毛豆3蔚来ET7更直观新能源汽车的迅速崛起,使得该领域竞争越来越大,以互联网造车三剑客蔚小理为首的新势力车企更是你追我赶,代表着自家造车实力的车型相继落地。在7月中旬的2021年港澳粤车展上,小鹏汽……天猫淘宝可以用微信支付了?平台入驻商家将获得这些红利腾讯与阿里的世纪和解,震动了整个互联网。而目前,双方合作的进一步落地,也有了新动态。目前双方正在制定开放计划,腾讯将允许天猫淘宝等电商信息内容分享至微信及朋友圈生态,而阿里也将……颜值好物,SoundPEATS泥炭SonicPro高续航无线大家好,我是科技君的探讨,欢迎关注我,与我一起进行科技的探讨。在物质丰富的现今,用户在选择产品上已不再那么随意了,而是从多方面进行考量,选择更高质量的产品。对于数码产品也……山灵UA1pro听音乐的好神器前言山灵的产品线这几年发展的不错,最近又推出了一款镜面工艺全新内核几乎0底噪低功耗大推力的转换器,深得大家喜欢。山灵在最近推出的UA1Pro就很好的满足了需要,这款耳放相……功能强大的电视盒子如何选,好用的电视盒子操作上手简单技术的不断发展,我们的生活方式也发生翻天覆地的改变,特别是现在我们的娱乐方式多种多样,特别是可以使用智能手机或者其他的电子产品,比如电视盒子就是很好的一个电子产品,它的功能非常……微信这六个功能,有些人天天用,有部分人都没打开过,太实用了微信几乎我们每天都在使用,但微信有很多实用的小功能,有一部分人都没有打开过,今天我给大家分享一下这些实用的小功能,大家可以收藏本视频,方便以后回去查看第一个就是创建新微信……用了蓝炬星AIoT高端集成灶,爆炒无油烟对于厨房电器,顾客最为关心的就是吸油烟率。中国家庭多爱爆炒,油烟大,因此对厨房大家电的吸烟率的要求也就相对较高。传统吸油烟机的技术没有办法达到完全洁净厨房的要求,蓝炬星Aiol……ASML或将拥有3000项专利,大多都是中国研发荷兰半导体巨头ASML作为这个世界上唯一一个能够生产EUV光刻机的企业,其在半导体领域的地位也是非常特殊的。而在今年,ASML方面也在顶住了美国的压力之后,其也表示其会对中国的……华为和小米同等配置下,为什么在价格上存在差异?手机价格的差异不仅仅在配置上,还包括产品定位、工艺设计、制作材料和黑科技等等。华为消费者CEO余承东和小米创始人雷军华为和小米同等配置下,价格存在差异,尤其是在旗舰……台式电脑windows10(不支持TPM模块)体验widow【前言】:之前写过一篇这样的贴子,觉得升级windows11系统体验后不太成熟,所以把帖子删掉了。我的老台式机也回退到Windows10系统,微软刚刚发布了Windows……奥迪在新能源汽车市场与自主新能源汽车品牌竞争,谁的胜算更大在过去的100多年以来,人类的生产经营活动很大程度上依赖于化石能源的开发与利用,据了解,全球有20的温室气体是因为人类破坏森林减少了二氧化碳吸收能力,以及不节制的能源消耗所造成……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网