城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

线程池的线程是如何复用的

3月19日 飞仙轩投稿
  前言
  进程和线程的关系相信大家都知道,这里我就不做过多的解释了,既然一个进程是由多个线程组成的,那么线程池又是由若干个线程队列组成的,在并发量比较高的情景下,我们通常会去创建线程池就执行任务,而不单一的创建多个线程去执行任务,因为线程的创建的一系列动作,是需要资源开销的,如果频繁的对线程创建销毁,其实本身是一种很浪费资源的,就更谈不上提高效率了。
  一般都会创建线程池将线程统一管理,并且还会引入阻塞和非阻塞队列,接收需要排队处理的任务,但是线程池里的线程是在处理完任务就会进行销毁么,其实并不是这样的,下面我们一起来对线程池里线程是如何复用的进行分析。使用线程池使用线程池原因
  1。复用已创建的线程,减少线程创建、销毁开销。2。可以根据自身系统的承载能力,合理对线程池线程数量进行控制。3。控制并发数,保护系统。privatestaticvoidcreatThreadPool()throwsInterruptedException{ListThreadthreadListnewArrayList();longstartSystem。currentTimeMillis();log。info(创建线程池开始);for(inti0;i100;i){ThreadthreadnewThread((){try{TimeUnit。SECONDS。sleep(10);}catch(InterruptedExceptione){e。printStackTrace();}},threadi);thread。start();threadList。add(thread);TimeUnit。MILLISECONDS。sleep(1);}longendSystem。currentTimeMillis();longneedTlog。info(创建100个线程所花费的时间:needTimems);}publicstaticvoidmain(String〔〕args)throwsInterruptedException{creatThreadPool();}复制代码
  创建100个线程需要264ms,平均一个线程的创建需要2。2ms左右,线程执行任务可以只需要不到1ms,那么这样看来创建线程是不划算的。
  这里除里JDK自带的四种线程池类型,简单介绍下jdk自带四种线程池。
  1。newCachedThreadPool:可缓存的的无界线程池,可以自动线程回收,通常执行短期异步的任务。
  2。newFixThreadPool:固定数量的线程池,控制并发数。
  3。newSingleThreadPool:单线程工作的线程池,所有任务按照FIFO先进先出的原则执行。
  4。newScheduleThreadPool:可定期执行的线程池,可指定执行时间和执行次数。
  通常情况下,在阿里的开发手册上写不推荐使用Executors创建线程,也就是线程池的顶级接口,jdk自带的线程池创建的时候是没有核心线程数的,不断的创建对象,那么就会存在内存溢出的风险。线程池的工作流程
  一般创建线程池还是使用ThreadPoolExecutor创建,它的上接口是ExecutorService,所有说真正创建线程池是用ExecutorService创建。7大核心参数这里就不多说了,直接说线程池的工作流程。
  1。首先当运行的线程池corePoolSize(核心线程数),就会创建线程执行这个任务
  2。线程池线程数corePoolSize(核心线程数),任务放入队列。
  3。队列已满,当前运行的线程数MaxImumPoolSize(最大线程数),创建非核心线程数执行任务,如果运行的线程数MaxImumPoolSize(最大线程数),使用Handler拒绝策略,当然不能丢弃任务,一般使用CallerRunsPolicy使用调用线程执行任务。
  4。当前线程不需要执行任务,也不能让它一直存在着占用资源,超出keepAliveTime,运行线程数corePoolSize,这线程会被回收掉,这样做主要是控制核心线程里线程数量。线程复用
  首先看ThreadPoolExecutor源码,execute线程池执行入口publicvoidexecute(Runnablecommand){if(commandnull)thrownewNullPointerException();当前线程数小于核心线程数intcctl。get();if(workerCountOf(c)corePoolSize){if(addWorker(command,true))cctl。get();}加入等待队列里排队处理if(isRunning(c)workQueue。offer(command)){intrecheckctl。get();检查工作线程停止工作是否需要移除,触发拒绝策略if(!isRunning(recheck)remove(command))reject(command);二次检查elseif(workerCountOf(recheck)0)addWorker(null,false);}无法提交线程则触发拒绝策略elseif(!addWorker(command,false))reject(command);}复制代码
  这里看到每个if判断里都存在addWorker方法,那么这个方法肯定是线程是否复用的重点,Wtry{将任务放到Worker工作线程里面,wnewWorker(firstTask);finalThreadtw。if(t!null){finalReentrantLockmainLockthis。mainLmainLock。lock();try{Recheckwhileholdinglock。BackoutonThreadFactoryfailureorifshutdownbeforelockacquired。intrsrunStateOf(ctl。get());if(rsSHUTDOWN(rsSHUTDOWNfirstTasknull)){if(t。isAlive())precheckthattisstartablethrownewIllegalThreadStateException();hashset集合里存放Worker对象workers。add(w);intsworkers。size();if(slargestPoolSize)largestPoolSworkerA}}finally{mainLock。unlock();}if(workerAdded){t。start();workerS}}}finally{if(!workerStarted)addWorkerFailed(w);}returnworkerS复制代码
  Worker是个final修饰的内部类,意味着不能被其他类继承,那么线程复用只能在这一个类里面进行,接着看Worker的run方法里面执行的runWorker方法,这个是线程复用的核心方法。finalvoidrunWorker(Workerw){ThreadwtThread。currentThread();获取线程里面执行的任务Runnabletaskw。firstTw。firstTw。unlock();allowinterruptsbooleancompletedAtry{如果任务不为空重新拿取线程里的任务while(task!null(taskgetTask())!null){w。lock();Ifpoolisstopping,ifnot,ensurethreadisnotinterrupted。ThisrequiresarecheckinsecondcasetodealwithshutdownNowracewhileclearinginterrupt判断线程的状态,并执行对应的拒绝策略if((runStateAtLeast(ctl。get(),STOP)(Thread。interrupted()runStateAtLeast(ctl。get(),STOP)))!wt。isInterrupted())wt。interrupt();try{beforeExecute(wt,task);Ttry{task。run();}catch(RuntimeExceptionx){}catch(Errorx){}catch(Throwablex){thrownewError(x);}finally{afterExecute(task,thrown);}}finally{w。completedTw。unlock();}}completedA}finally{processWorkerExit(w,completedAbruptly);}复制代码
  getTask方法重新拿取线程里的任务,前面一系列的判断主要是来检查线程的状态,以及线程池线程的数量,其核心主要是线程数量是否超过了核心线程数,如果超过了则会进入workQueue工作队列,workQueue。poll非核心线程会一直去工作队列里获取任务,非核心线程已经满了,则会workQueue。take()核心线程去获取任务,前面的runWorker方法是有while循环的,这样就会一直执行下去,循环拿取任务,如果这个时候工作队列里面没有队列,超过keepAliveTime线程存活时间还没有拿到任务,则会对对应线程进行销毁。privateRunnablegetTask(){booleantimedODidthelastpoll()timeout?for(;;){intcctl。get();intrsrunStateOf(c);Checkifqueueemptyonlyifnecessary。if(rsSHUTDOWN(rsSTOPworkQueue。isEmpty())){decrementWorkerCount();}intwcworkerCountOf(c);Areworkerssubjecttoculling?booleantimedallowCoreThreadTimeOutwccorePoolSif((wcmaximumPoolSize(timedtimedOut))(wc1workQueue。isEmpty())){if(compareAndDecrementWorkerCount(c))}try{Runnablertimed?workQueue。poll(keepAliveTime,TimeUnit。NANOSECONDS):workQueue。take();if(r!null)timedO}catch(InterruptedExceptionretry){timedO}}}复制代码总结
  在日常开发中,对线程池的优化也是比较重要的,如果线程池的核心线程数和最大线程数都不是随意定义的,还是要结合本身服务器cpu的情况,以及阻塞队列的使用,在一定情况下能缓解线程的压力,本身阻塞队列是带有阻塞和唤醒的功能,阻塞队列的长度也是需要根据实际开大的业务场景去定义的,最后运用好线程池,在处理高并发的业务场景下还是尤为关键的一项技术。
投诉 评论 转载

封车讯满电满油能跑1200公里?是骡子是马拉出来遛遛如今,随着增程式和插电式这两种油电混动技术的快速应用,很多新车在满电满油的情况下,都已突破了续航过千的传统燃油车的瓶颈,比如长安深蓝、吉利雷神以及新势力中的理想、问界、哪吒等。……5岁女孩面部胳膊不自主抽动,中医一张良方平肝熄风最近有家长留言问我:孩子的抽动症最严重能发展到什么程度?在这里和各位家长说一下,孩子不管是眨眼、挑眉、耸肩、发声、鼓肚子等等,抽动症的症状没有轻重之分。而且这些症状会轮换着来,……起步型B端产品如何开启运营工作,成功切入市场?本次直播我们邀请到快牛智营运营总监张沐老师,其有着7年产品运营实操经验;曾从0到1的全方位搭建产品运营体系,深知不同类型产品各个阶段的运营要点,是人人都是产品经理等社区的专栏作……两性交往,想要把女人追到手,首先要做好这两件事前言:在两性交往的过程当中,有很多事,我们一定要做好,不要总是觉得生活无所谓,在这个世界上我们掌握正确的方式,才能够让自己好好过下去,其实人生的每一步路都是很不容易的,如……怎么样才能让自己的人生获得新生1。早上赖床:一日之计在于晨2。没有节制的刷手机,不管随时随地都不忘自己的手机3。沉迷游戏无法自拔,不仅浪费了时间,甚至严重的影响了自己的休息和工作4。想一出……林丹全家出行,谢杏芳佩戴高价项链显疲态,夫妻距离隔太远不甜蜜提到林丹,这位世界羽毛球历史上最伟大的球星。虽然在之前不断有网友呼吁其能够前往国家队担任教练,帮助如今在世界羽坛地位日渐下降的国家羽毛球队。但林丹目前并没有这样的打算,他如今最……2022年度热门流行语TOP10,一文检验你是5G冲浪弄潮儿互联网时代,各种网络流行语层出不穷。从对yyds、emo、凡尔赛的一知半解,到现在的熟悉运用,网络流行语不仅是体现网友现实生活的一面镜子,也是全民语言智慧的结晶。2022年即将……联想ThinkPhone手机通过3C认证,支持68W快充此前曾有一份爆料提到,除了拯救者游戏手机和摩托罗拉品牌产品外,联想似乎还有望带来另外一个手机系列,即联想ThinkPhone。目前,这款爆料的新机已经通过了国家3C质量认……CBA上海队第二阶段欲卷土重来,李春江全面清洗大外援,有望5CBA第一阶段赛程落下帷幕,上海男篮的成绩暂时定格为3胜6负,位居CBA积分榜倒数第四的位置。很显然,无论是上海队的投资占比、还是阵容豪华度、甚至是整体的综合实力,都与倒数的成……如何发挥孩子内在优势,帮助孩子获得幸福的人生?孩子的品格本文字数7323,预计阅读时间15分钟。阅读使人充实,分享使人愉悦。文章结尾附有思维导图,帮你梳理文中脉络精华。欢迎阅读,你离知识又近一步。今天分享的书籍是《孩子的……线程池的线程是如何复用的前言进程和线程的关系相信大家都知道,这里我就不做过多的解释了,既然一个进程是由多个线程组成的,那么线程池又是由若干个线程队列组成的,在并发量比较高的情景下,我们通常会去创……舞台搭建在机场内部!天府工匠今晚重磅首播12月29日21点,由成都市广播电视台、成都市总工会、成都市人社局共同打造的大型技能挑战融媒体节目《天府工匠》将在CDTV2重磅首播,成都广播电视台全媒体矩阵联动播出,同时在抖……
十天拜访逾十家企业李东生为何此时密集走访韩日产业伙伴?如数家难忘戴手铐的旅客,42年前上映,如今于洋邵万林都已90多岁杜兰特55分还输球?欧文的回答让球迷气愤,完美避开自身问题衬衫红唇高跟鞋,徐峥的3个上海女人,穿搭谁最灵啊16分逆转公牛OT击沉快船德罗赞5056乔治225通过这款手机,我们进到了魅蓝金立乐视的默契美联储加息,人民币会贬值吗?夏夜,站在时光的庭院里两个坏消息!微软停招中国高校学生,12家中概股再被下黑手中国女子金球奖王霜王珊珊等亚洲杯夺冠功臣入围云南西盟大抓项目抓大项目蓄势赋能高质量发展16核心混合架构!英特尔13代酷睿处理器i713700图赏
雾霾是经济环境失衡的一种表征效力待定合同和可撤销合同的区别在哪生二胎的孕前准备有哪些蜂蜜泡白萝卜治咳嗽吗蜂蜜萝卜治咳嗽偏方迈阿密热火球员小琼斯我感觉良好,首轮系列赛我可能会复和五松小龙女歌韦贤妃简介靖康之耻中的韦贤妃靖康之耻的女人下场演技雷人胸器却逼人的5大女星盘点看看你喜欢哪个齐心协力的蟹图观致5采用家族式设计车尾造型饱满拉风十足缓刑的适用条件是什么黑老大刘汉,杀人敛财无恶不作,被捕后扬言你们没资格审我!

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁