线程池监控和动态配置

本文深入探讨了Java线程池的原理与使用,包括线程池的好处、Executors的使用、ThreadPoolExecutor的构造与配置,以及线程池的状态和任务调度机制。此外,文章还强调了避免使用Executors创建线程池,并推荐使用ThreadPoolExecutor。线程池监控方面,介绍了如何监控运行数据、监控指标和数据存储,以及动态可观测线程池的实现,如美团的DynamicTp和Hippo4J框架。
摘要由CSDN通过智能技术生成

线程池

线程池是一种 “池化” 的线程使用模式,通过创建一定数量的线程,让这些线程处于就绪状态来提高系统响应速度,在线程使用完成后归还到线程池来达到重复利用的目标,从而降低系统资源的消耗。

池的好处

使用线程池,有如下优势

  1. 降低资源消耗
    • 通过重复利用已创建的线程降低线程创建和销毁造成的消耗
  2. 提高响应速度
    • 当任务到达时,任务可以不需要等到线程创建就能立即执行
  3. 提高线程的可管理性
    • 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控
  4. 提供更多更强大的功能
    • 线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池 ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行

Executors

为了能更好的控制多线程,JDK 提供了一套 Executor 框架,其本质就是一个线程池,它的核心成员如下。

接口或类 说明
Executor 接口 定义了一个接收 Runnable 对象的方法 executor
ExecutorService 接口 一个比 Executor 使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回 Future 的方法
AbstractExecutorService 抽象类 ExecutorService 执行方法的默认实现
ScheduledExecutorService 接口 一个可定时调度任务的接口
ScheduledThreadPoolExecutor ScheduledExecutorService 的实现,一个可定时调度任务的线程池
ThreadPoolExecutor 多用于创建线程池

常用方法

Executors 常用方法如下

  1. newCachedThreadPool()
    • 创建一个可缓存的线程池
    • CachedThreadPool 适用于并发执行大量短期耗时短的任务,或者负载较轻的服务器
  2. newFiexedThreadPool(int nThreads)
    • 创建固定数目线程的线程池
    • FiexedThreadPool 适用于负载略重但任务不是特别多的场景,为了合理利用资源需要限制线程数量的场景
  3. newSingleThreadExecutor()
    • 创建一个单线程化的 Executor
    • SingleThreadExecutor 适用于串行执行任务的场景,每个任务按顺序执行,不需要并发执行
  4. newScheduledThreadPool(int corePoolSize)
    • 创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代 Timer
    • ScheduledThreadPool 是一个调度池,其实现了 schedulescheduleAtFixedRatescheduleWithFixedDelay 三个方法,可以实现延迟执行、周期执行等操作
  5. newSingleThreadScheduledExecutor()
    • 创建一个 corePoolSize 为 1 的 ScheduledThreadPoolExecutor
  6. newWorkStealingPool(int parallelism)
    • 返回一个 ForkJoinPool 实例
    • ForkJoinPool 主要用于实现 “分而治之” 的算法,适合于计算密集型的任务

避免使用Executors创建线程池

根据阿里《Java开发手册》,要避免使用 Executors 创建线程池,推荐使用 ThreadPoolExecutors 创建线程池。

  1. Executors 创建的 FiexedThreadPoolSingleThreadPool 任务队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM;
  2. Executors 创建的 CachedThreadPoolScheduledThreadPool 允许创建的线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

ThreadPoolExecutor

Java 中,线程池的实现类是 ThreadPoolExecutor,其构造函数如下。

public ThreadPoolExecutor(int corePoolSize,
                        int maximumPoolSize,
                        long keepAliveTime,
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值