🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。 ## 线程池是什么 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。 线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。 当然,使用线程池可以带来一系列好处: - 降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。 - 提高响应速度:任务到达时,无需等待线程创建即可立即执行。 - 提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。 - 提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。 ## 线程池解决的问题是什么 线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题: 1. 频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。 2. 对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。 3. 系统无法合理管理内部的资源分布,会降低系统的稳定性。 4. 为解决资源分配这个问题,线程池采用了“池化”(Pooling)思想。池化,顾名思义,是为了最大化收益并最小化风险,而将资源统一在一起管理的一种思想。 `Pooling is the grouping together of resources (assets, equipment, personnel, effort, etc.) for the purposes of maximizing advantage or minimizing risk to the users. The term is used in finance, computing and equipment management.——wikipedia` “池化”思想不仅仅能应用在计算机领域,在金融、设备、人员管理、工作管理等领域也有相关的应用。 在计算机领域中的表现为:统一管理IT资源,包括服务器、存储、和网络资源等等。通过共享资源,使用户在低投入中获益。除去线程池,还有其他比较典型的几种使用策略包括: - 内存池(Memory Pooling):预先申请内存,提升申请内存速度,减少内存碎片。 - 连接池(Connection Pooling):预先申请数据库连接,提升申请连接的速度,降低系统的开销。 - 实例池(Object Pooling):循环使用对象,减少资源在初始化和释放时的昂贵损耗。 - 在了解完“是什么”和“为什么”之后,下面我们来一起深入一下线程池的内部实现原理。 ## 构建线程池基本原则: 1. 线程池任务独立,避免出现互锁场景,降低锁复杂度 2. 对于执行较慢、数量不大的IO任务,需要优先扩大线程数,而不需要太大的任务队列 3. 对于吞吐量较大的CPU密集型任务,线程数量不宜过多(常规的CPU核数或者核数*2),可用较长的队列作为缓冲 4. 线程池监控:独立的线程池名称、有效的拒绝策略加日志