前言
二面碰到这个问题人都麻了,我扯了好多没用的,面后赶紧来补一下,但是找到的基本都是一堆纯代码,不是讲思路的。下面的思路是我参考美团技术团队文章后总结的。
具体思路
一、总体设计
线程池在内部实际上构建了一个生产者–消费者模型,将线程和任务解耦,不直接关联。所以我们可以将线程池的运行分为两部分:线程管理、任务管理。
任务管理部分充当生产者
线程管理部分充当消费者
任务管理部分负责分发、缓冲或者拒绝任务,也就是生产者。
线程管理部分负责消费任务,任务执行完会获取新任务,获取不到任务会被回收。
二、生命周期管理
线程池运行的状态,并不是用户显式设置的,而是伴随着线程池的运行,由内部来维护。
所以我们应该设计一个变量,标记着线程池的运行状态以及线程数量(为什么包含线程数?一个线程池都没有线程,还叫线程池?没线程了说明差不多寄了)。
于是线程池的生命周期,运行状态即被这个变量控制了。(感觉不需要说细节,思路即可)
三、任务执行机制
这部分应该玩不出什么花来了,我大概说说吧。
思路:
1.首先学习现有机制(解释一遍执行流程)
2.然后要选择任务队列的数据结构(BlockingQueue等)
3.任务拒绝(原生4种,也可自己定制)
四、线程管理
线程是线程池内的资源,线程池应当掌握线程状态并维护线程的生命周期(如原线程池中Worker线程)。
比如,线程什么时候才回收?什么时候创建?这是需要考虑的。这里不多说,毕竟思路。
尾声
思路还是好聊的,关键如果抠细节就太麻烦了,话说如果希望深入了解的请看看原文:美团文章