第一部分:创业
面试题:讲一下线程池的内部原理
为了便于理解,我们可以结合现实中的场景去结合理解记忆。
- 你开了一家大型饭店,饭店需要厨师(线程)。你综合考虑所计划招募(corePoolSize)5个,你钱包决定最多能招募(maxiumPoolSize) 20个。
- 生意兴隆,吃饭的人络绎不绝,赶紧招募一个厨师, 名声在外吃饭的人更多啦,赶紧再招募一个厨师,…不知不觉,已经招募了corePoolSize个啦。
- 考虑到经济成本问题,暂且搞点茶水点心,让顾客排队等待(BlockingQueue) 吧。一不留神,这队伍已经太长啦(这可不行,影响交通,城管找茬)。
- 舍不得孩子套不着狼,赶紧打电话再从新东方烹饪学校(ThreadFactory) 继续招聘厨师…,吃饭的客人太多了,已经招募到maxiumPoolSize个啦。
- 天下的银子不可能都让我赚了, 再来客人,你陪着笑脸心里想着如何谢绝顾客(RejectExecutionHandler),后面会有一期专门讲。
讲到这里,大家都应该能记住其中的5个参数
- corePoolSize : 计划招募人数
- maxiumPoolSize :最大能招募人数
- BlockingQueue< Runnable > : 排队的队列
- ThreadFactory : 新东方烹饪学校
- RejectExecutionHandler : 拒绝顾客的策略
“原理”源于生活且不高于生活。
第二部分:如何处理临时工
龙在沙滩被虾戏,虎落平阳被犬欺
曾经有朋友抱怨遇到过“BT”(其实一点也不)面试官,会问: 线程池有哪几个参数。To be honest,老司机也会懵逼一下下,不是不知道Just突然说不出来。
科普一下,大家要注意数字7在西方是个非常神圣的数字
一周有几天,线程池就有几个参数。第一部分相当于工作了5天,周六日这2天大家更应该兴奋啊。
作为饭店老板的你很快意识到一个问题,生意有好有坏,养不起这么多(maxiumPoolSize)个厨师。怎么办呢?你下意识的想到了临时工— 机制 。
- KeepAliveTime : 等待keepAliveTime,若还没有顾客,就裁撤这些临时工;
PS : keepAliveTime 到底是按照什么时间单位来设置呢?你默默地点了一根烟,灵活处理吧。此时的你,已经不局限于做一个饭店老板啦。
- TimeUnit : 时间单位刻度。
第三部分:也许都是临时工
谁无虎落平阳日,待我风山再起时.
既然你已经认定自己要做大事,那就得思虑周详。你默默的看向了操作间。
老板活不下去地时候,“正式工”的概念也就没有意义啦。但是考虑到不能伤人心,所以摸摸的设置了一个变量allowCoreThreadTimeOut。
allowCoreThreadTimeOut:当设置为true时,所有的“厨师”都是临时工。只要keepAliveTime一到,都卷铺盖走人。
结尾
此部分有几个问题需要处理:
- 作为饭店老板的你,拒绝策略,着实让人头疼。
- 不甘平凡的你如何做大事。
- …
欲知后事如何,且听下回分解