有关这个系列的题目,我也纠结了一阵子。不知道该如何取名,本来想着叫“Java 线程池代码解读”,后来以为单纯的代码解读,极可能没法理解其设计的精髓。思来想去,以为仍是叫“实现一个线程池”比较合适。为何呢?数据库
不少人可能会有疑惑,既然Java已经提供了优秀的线程池,为何咱们还要考虑去实现一个线程池呢,不都说不要重复造轮子嘛。我想是这样的,当一个想成为优秀“匠人”的人,在面对一个设计精良的“轮子”时,总抑制不住好奇和冲动,想知道这“轮子”是怎么形成来的。缓存
那既然式想了解“轮子”是怎么造的,咱们直接看“图纸”不就能够了嘛,干吗还再画一遍“图纸”呢?性能
这里面的差距是很大的,当咱们看“图纸”的时候,总会有种错觉,感受就应该这么设计,而忽略了最重要的问题,为何要这么设计呢。若是咱们不是造轮子的人,咱们是不会深入理解的。而当咱们尝试“重复”造轮子的时候,咱们会和优秀的“匠人”产生思想的碰撞,这种思想的碰撞,会产生深入的记忆和反思。线程
线程池自己是池化技术之一,和数据库链接池同样,使用线程池主要是出于如下的考虑设计
咱们看一个单线程的例子,一个线程的完整周期大体须要3个步骤生命周期
整个线程的执行时长T=T1+T2+T3 实际上,咱们能够看到,除了T2以外,T1和T3是能够经过线程池节省出来的。这也是线程池的一个很重要的目标,线程池托管线程的建立和销毁,也就是说,线程池是线程生命周期的管理者,这一点很是重要。队列