Java线程池概述

什么是线程池

线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。

注: 池化,顾名思义,是为了最大化收益并最小化风险,而将资源统一在一起管理的一种思想。

线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务,实现了线程和任务之间的解耦。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。

下图展示了线程池的原理:

为什么用线程池

  1. 线程池要解决什么问题?

    线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题:

    • 频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。
    • 对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。
    • 系统无法合理管理内部的资源分布,会降低系统的稳定性。
  2. 线程池的好处

    • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
    • 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
    • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控
  3. 什么时候使用线程池

    • 单个任务处理时间比较短
    • 需要处理的任务数量很大

Java中线程池类图

上图展示了Java中和线程池相关的部分类图。其中层次关系如下:

  • Executor接口:线程池顶层接口,提供了一种思想: 将任务提交和任务执行进行解耦。

    用户无需关注如何创建线程,如何调度线程来执行任务,用户只需提供Runnable对象,将任务的运行逻辑提交到执行器(Executor)中,由Executor框架完成线程的调配和任务的执行部分。

  • ExecutorService接口:增加了一些能力

    • 扩充执行任务的能力,补充可以为一个或一批异步任务生成Future的方法;
    • 提供了管控线程池的方法,比如停止线程池的运行。
  • ScheduledExecutorService : 扩展了ExecutorService。支持Future和定期执行任务

  • AbstractExecutorService:上层抽象类, 将执行任务的流程串联了起来,保证下层的实现只需关注一个执行任务的方法即可。

  • 底层实现类:ThreadPoolExecutor和ScheduledThreadPoolExecutor

    一方面维护自身的生命周期,另一方面同时管理线程和任务,使两者良好的结合从而执行并行任务。

参考资料

  1. http://www.ideabuffer.cn/2017/04/04/
  2. https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html
  3. https://pdai.tech/md/java/thread/java-thread-x-juc-executor-ThreadPoolExecutor.html
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信