说到java线程池,对我们这些普通的应用开发者来说,可能是既熟悉又陌生,为什么这样讲呢?熟悉是指我们对线程池是耳熟能详,跟人说起总能唠嗑几句;而陌生,是指我们对线程池的设计与实现的陌生,是对java jdk对线程池的实现细节的陌生,所以对于线程池,我们可能停留在能唠嗑几句的层面。
线程池是对象池的一种,也就是我们常说的池化技术的一种具体实现,类似的有数据库的连接池 ,Netty ByteBuf缓冲池等,为什么我们需要池化的技术?说到底,是为了对硬件资源的充分规划和复用,避免内存抖动从而提高资源的利用率和性能,更能保证软件系统的稳定性和可控性。
这些考虑在线程资源的设计上体现得更加明显,我们都知道,线程在java程序中是最重要的资源,可能没有之一,一方面体现在创建线程需要耗费内存,这里包括堆上和虚拟机栈,另一方面体现在线程调度上需要耗费cpu资源,可以说线程是一个重资源的组件,用得不好可能造成系统不可用,最常见错误是造成内存泄漏。所以对线程进行池化是很有必要和迫切的。
那么线程池又该怎么去设计?
首先,我们需要先想清楚线程池的需求是什么,此时需要我们切换成产品经理的思维去想需求,线程池的需求有哪些?以下罗列了一些可能很有必要的需求:
1)线程池需要自动调节和掌控线程的生命周期(包括线程的创建,使用和摧毁)
2)线程池需要控制线程数量的大小(就像国家对人口的规划和控制一般)
3)线程池需要对任务进行管理(包括任务的存储,分配,执行,返回值,丢弃策略等)
4)线程池需要把控自身的生命周期(包括线程池的创建,使用和关闭)
5)线程池需要针对不同应用场景个性化定制(线程池需要不同种类)
针对上诉需求,java jdk又是如何设计的?且听下回分解:
《java线程池数据结构》