开篇
有关这个系列的题目,我也纠结了一阵子。不知道该如何取名,原本想着叫“Java 线程池代码解读”,后来觉得单纯的代码解读,很可能无法理解其设计的精髓。思来想去,觉得还是叫“实现一个线程池”比较合适。为什么呢?
很多人可能会有疑惑,既然Java已经提供了优秀的线程池,为什么我们还要考虑去实现一个线程池呢,不都说不要重复造轮子嘛。我想是这样的,当一个想成为优秀“匠人”的人,在面对一个设计精良的“轮子”时,总抑制不住好奇和冲动,想知道这“轮子”是怎么造成来的。
那既然式想了解“轮子”是怎么造的,我们直接看“图纸”不就可以了嘛,干嘛还再画一遍“图纸”呢?
这里面的差距是很大的,当我们看“图纸”的时候,总会有种错觉,感觉就应该这么设计,而忽略了最重要的问题,为什么要这么设计呢。如果我们不是造轮子的人,我们是不会深刻理解的。而当我们尝试“重复”造轮子的时候,我们会和优秀的“匠人”产生思想的碰撞,这种思想的碰撞,会产生深刻的记忆和反思。
为什么需要线程池?
线程池本身是池化技术之一,和数据库连接池一样,使用线程池主要是出于以下的考虑
- 减少创建时的开销,节省性能
- 统一的管理,便于监控
我们看一个单线程的例子,一个线程的完整周期大致需要3个步骤
- 线程的创建和资源分配(T1)
- 线程执行(T2)
- 线程结束和资源回收(T3)
整个线程的执行时长T=T1+T2+T3
实际上,我们可以看到,除了T2之外,T1和T3是可以通过线程池节省出来的。这也是线程池的一个很重要的目标,线程池托管线程的创建和销毁,也就是说,线程池是线程生命周期的管理者,这一点非常重要。
一个线程池应该具备哪些条件?
- 线程的生命周期管理,主要包括创建和回收
- 线程池的生命周期,初始化,执行,销毁等
- 任务,指的是具体每个线程要执行的
- 任务队列,主要用于存放任务,缓存等待。