德州站旁边,王二经营一家厕所服务公司,为公众提供便民入厕服务。
车站每天人来人往。人越多,自然,王二的生意就越好。
王二这里固定提供3间厕所,当超过3人用厕时,后面的人就排队等候。如果生意太好,排队的人数超过10人,王二就会打开2间备用厕所,供客人使用。不过呢,每间厕所的维护费用也是一笔支出呀,比如,冲水费、电费、纸巾费、卫生保洁费。所以呢,备用厕所超过半小时没人用的时候,就把备用厕所锁起来等待备用。如果客人还增加的时候,王二只好把那个“暂停服务”的招牌摆出来,不再接客。没办法,小本生意嘛,盘子有限。
好,这天微微亮,王二的生意就开张了。
第一位客户张飞急匆匆地跑来了,好,王老板打开一间厕所的房门请张飞入厕。
接下来,刘备和关羽来了,王老板打开另外两间厕所的房门,请刘关二兄弟入厕。此时,3间固定厕所都满了。
关羽是小便,很快就出来了。
不远处,张良、萧何两人缓缓走来,这时,有一间厕所是空闲的,王二就请走在前面的张良入厕,萧何等待。
又等了一刻钟,明太祖朱元璋带着儿子(义子)朱标、朱棣、朱勇、沐英进来,由于3间厕所都在使用,他们5人就跟着排在萧何后面。
朱元璋的干将们——李善长、徐达、李文忠、冯胜来随即进来,4人也跟着排在队尾。此时,已经有10人在排队,达到了王二设定的排队上限。
然后,作为本文读者的你来了,你可是VIP客户呀,王二立马打开了一间备用厕所,请你进入方便。
终于,张飞、刘备用厕完毕,空出来2间厕所,那么,王二请排在前面的萧何、朱元璋入厕。
再接下来,黄蓉和郭靖进来,二人按顺序排队。此时,排队阵容又达到了10人,王二今天生意兴隆呀!
“明月几时有,把酒问青天”,豪放派词人苏轼踏歌而来。王二见状,赶紧把另一间备用厕所打开,请苏轼进入方便。
即便如此,客人依然络绎不绝,比如,拿破仑,丐帮帮主乔峰和阿朱,不过,王二这里已经都满员了,就只好让谢绝为他们提供服务了。
不一会,你和朱元璋用厕完毕,王二请朱标、朱棣二兄弟入厕。这时,在用厕的人有张良ing、萧何ing、苏轼ing、朱标ing、朱棣ing。
五人很快也相继出来了,王二赶快安排朱勇、沐英、李善长、徐达、李文忠这五人依次进入方便。
十分钟后,朱勇、沐英、李善长、徐达、李文忠这五人也用厕完毕。此时呢,只有冯胜、黄蓉和郭靖在排队,王二就请这三位入厕方便。终于没有排队的人了。注意,此时一共打开了5间厕所,包括那2间备用厕所。如果在接下来的半小时里没有使用的话,王老板就会暂时收回备用。
4分钟后,黄蓉出来。此时,除了备用厕所空着以外,还空出来一间固定厕所。
然后,康有为进来,王二请康先生进入空出来的那间固定厕所。
3分钟后,康有为用厕完毕。此时,在用厕的还是冯胜和郭靖。
再过1分钟,拿破仑又来了,王二请他进入空出来的那间固定厕所。
11分钟后,冯胜、郭靖用厕完毕。
嘀~嗒~嘀~嗒,时钟不停摆动,不知不觉,备用的那两间厕所已经半小时没有使用了,为了节约开支,王二就先收回这2间厕所,等待人多的时候再打开使用。
再然后,拿破仑用厕完毕,到这时,王二一共迎来了23位客人,为20人提供了用厕服务,另有3人因为生意火爆而没办法提供服务。忙碌半天的王二,终于可以喘口气休息一下了。
以上是王二为公众提供入厕服务的一个早上的生意情况。说了一堆,不知道各位程序猿看官是不是还有些迷糊。
那么,下面,我把王二手记的台账列出来,也许更直观。
以上案例,从线程池的角度可以理解为,①王二的公厕服务公司相当于是一个线程池(threadpool);②王二所提供的厕所相当于是线程(thread),三间常备厕所,相当于核心线程数(corePoolSize)是3,两间备用厕所,相当于最大线程数(maxPoolSize)是3+2=5;③每位客人来用厕大小便相当于是要执行的任务(task);给客人提供方便服务过程中的厕所,叫工作线程(worker),很显然,工作线程数≤最大线程数;④当厕所都在使用时,后面的前来用厕的客人需要排队,这个队列就是workQueue,王二最多允许10位客人排队,相当于workQueue的capacity,就是说workQueue.size()=10;⑤当所有厕所都在使用并且排队人数达到10人,后面的客人就会被拒绝提供服务,这相当于是触发了线程池的拒绝策略;⑥备用厕所在空闲半小时没人用的时候被自动收回,相当于超出corePoolSize的线程,在等待特定的keepAliveTime(ttl)内无任务处理,则自动销毁;⑦每个厕所在不同时刻会存在启用、等待使用、在使用、使用结束等情况,这就相当于线程的状态(见Thread.State)。
好,通过上面的举例,下面再介绍线程池可能大家就更容易理解了。