前言本文以一个程序员的例子作为需求,来对比一下线程池的工作过程。大白话给大家讲解一下线程池的工作原理,让大家更好的理解线程池。感谢阅读~什么是线程池?什么是核心线程?什么是阻塞队列?什么是非核心线程?什么是闲置生存时间?什么是饱和策略?线程池工作原理流程图&源码概览github地址,谢谢各位Starhttps://github.com/whx123/JavaHome什么是线程池?努力工作,夜以继日。终于有一天,他被提拔为公司董事,负责公司的日常事务。风平浪静的一天,老板找到了肖天洛,“我们公司的员工越来越多,我想建立一个‘员工管理系统’,你在那边安排一下,一个月就能搞定。”肖天洛拍拍胸口,没问题!因为公司还没有程序员,小天罗赶紧打开“猪八戒网”,提交了员工管理系统需求。短暂等待后,“开发者(姓名,线程A)”接单、谈判合同、开始开发、交付系统……经过一系列流程,一个月后,一个完整的员工管理系统终于完成了……老板大为赞赏~过了一会,老板又开口了,“公司迟到的人越来越多了,我们建个‘考勤系统’吧!”萧天落接到任务,立马开始去猪八戒网请人开发。这一次,他是来“线程B接单”的……死人就是这样,月底,老板又提出要制定薪资制度……萧天洛听得头皮发麻,一天一天,反复去网上找人开发呀!“为了节约成本,要不我们雇几个程序员(线程a、b、c),成立自己的IT技术部门吧!我们就把IT部门叫做‘线程池’吧!”老板一听,一拍即合!!!线程池是管理线程的池,当有任务需要处理时,不会频繁地创建新的线程,而是从池中取出一个线程进行处理。当任务执行完毕后,线程不会被销毁,而是在等待下一个任务。因此,可以节省资源,提高响应速度。什么是核心线程?“线程池”IT部门成立后,聘请了与公司有正式合同的员工a、b、c几名。线”。老大提出一个请求,小天罗就把请求分配给“无事可做”的线程……什么是阻塞队列?一天早上,老板困了。来到公司后,我一口气提到了“四个要求”,a、b、c。按顺序接完任务,发现还剩一个需求任务。这个怎么安排?你又去“猪八戒兼职网”找人了吗?成立“线程池IT部”找人(找线程干活),会被人笑话!聪明的小蜗牛想到了一个好办法,就是建立一个DPMS需求池,将未分配的需求放入DPMS需求池中完成,等待a、b、c先完成工作,再把这个任务拿走。我们把这个DPMS需求池命名为“阻塞队列”,英文名是“WorkQueue”!什么是非核心线程?又是一个阳光明媚的下午,老大喝了杯咖啡,跑去看“阻塞队列”(DPMS需求池),一看就傻!!需求池里积累了几十个需求,排的满满当当。老板立即叫来“肖天洛进办公室来”,商量如何处理这些艰巨的任务。“我们雇佣更多的员工(多多少个“核心线程”)怎么样?”“不行不行,公司的财务‘费用’有点高!””要不,我们要求业务少提任务要求?(“少提要求”)”“你是不是傻,少提要求,你不就毁了自己的家业吗?你先回家想想办法!!”老大放大了声音~萧天洛回家闭上眼睛让老天爷,每天早点睡觉,把耳朵堵上……终于有一天,在梦里,他想到了一个好办法。“老板,我们可以去另一家公司(”外包公司“)雇佣几个员工(假设名字是d,e,f,g)工作一段时间,让他们做”DPMS需求中的需求pool(blockingqueue)”。就等需求完成了,再送回去。老板一听,很高兴。这个方案不错,他很高兴:“有人完成了需求的工作,并且公司的财务省了钱。真是两全其美。”~这些外包员工(d,e,f,g),姑且称之为“非核心线程”。什么是空闲时间?既然d,e,f,g外包员工(“非核心线程”-corethreads")来了,老板松了一口气,干了那么多活,终于有人做了。可是,又是一天,七点多,也就是所谓的下班时间,老板从办公室,发现“线程池”IT部门的员工都匆匆离开了,心里怒道:“怎么这些香肠一下班就跑了?工作这么不饱和?”他随便点进DPMS需求池,发现原来的需求已经完成了。..还有一堆外包的同事(非核心线程)需要发工资。这一波亏大了~第二天,萧天落就被“偷偷”叫进了老板办公室,因为DPMS需求池已经没有需求了。我们要把外包的同事(非核心线程)送回去吗?但是一般情况下,需求一消失,我们就立马让他们回去(“线程回收”)。不然需求池空的时候,让外包的同事(“非核心线程”)15天还是10天后回去?”15天或者10天的定义是“线程空闲生存时间”什么是饱和攻略?临近双11,不仅老板提出了很多诉求,新业务小姐姐们也提出了很多诉求,新的诉求如流水般从源头涌来~首先,“threadpool”IT部门a,b,c三个正式员工(核心线程)忙于处理需求(”request”),然后,DPMS需求池(”blockingQueue”)也满了,最后,连d,e,f,g外包的同事(“非核心线程”)太忙了,这个时候需求还没做完,怎么办?双十一急着上线?小天罗皱着眉头,从“涨潮到落潮”……没办法,只能用“饱和策略”。比如“放弃需求任务”?“抛出异常告诉老板不要添加需求”?“丢弃需求池中最早的需求任务”?新需求”,所以“线程池”的IT部门还在正常运行~线程池中的饱和策略事件主要有四种:AbortPolicy(抛出异常,默认)DiscardPolicy(新提交的任务直接丢弃)丢弃队列中最老的任务,继续将当前任务提交给线程池)CallerRunsPolicy(交给线程池调用的线程处理,即部分任务会回滚给调用者)线程池工作原理流程图&源码概览故事讲完了,我们来回顾一下线程池工作流程图~有兴趣的朋友,也可以看看源码~if(command==null)thrownewNullPointerException();intc=ctl.get();//判断当前活跃线程数是否小于corePoolSizeif(workerCountOf(c)
