线程池的本质
线程池的本质是一种池化技术。而池化技术是资源复用的一个设计思想。
比较常见的池化技术有:连接池、内存池和对象池。
线程池、字符串常量池、数据库连接池的使用都离不开池化思想。
底层工作原理
比如银行办公窗口满了,阻塞队列(候客区)也满了,这个时候需要扩容银行的加班窗口,扩容后新进来的线程会直接抢占新扩容的加班窗口,若任务还在持续增加会启动饱和拒绝策略,若热任务量下降了(多余空闲线程的存活时间)会缩容。
核心设计目的
线程池里面复用的是线程资源,它的核心设计目的有两个:
- 减少线程的频繁创建和销毁带来的性能开销,因为线程创建会涉及到CPU上下文切换、内存分配等工作。
- 线程池本身会有参数来控制线程创建的数量,这样就可以避免无休止的创建线程带来的资源利用率过高的问题,起到了资源保护的作用。
线程复用技术
因为线程本身并不是一个受控的技术,也就是说线程的生命周期是由任务的运行状态来决定的。无法去人为控制。
所以为了实现线程的复用,线程池里面用到了阻塞队列。
简单来说,就是线程池里面的工作线程处于一直运行状态。它会去从阻塞队列里面去获取待执行的一个任务。一旦队列空了,那么这个工作线程就会被阻塞。直到下一次有新的任务进来。
也就是说工作线程是根据任务的情况来决定阻塞和唤醒。从而去达到线程复用的一个目的。
最后线程池里面的资源限制是通过几个关键参数来控制的。分别是核心线程数和最大线程数。核心线程数表示默认长期存在的工作线程。而最大的线程数是根据任务的情况来动态创建的线程。
它的主要目的是为了提高阻塞队列中任务的处理效率。
线程池的作用
提高资源的利用率。
不使用线程池的线程操作步骤
- 手动创建线程对象
- 执行任务
- 执行完毕,释放线程对象
源代码思想体现
其中的动态扩容和缩容思想、线程的复用思想以及线程的回收方法等等。
参考资料: