PassJava (佳必过) 项目全套学习教程连载中,关注公众号悟空聊架构第一时间获取。

文档在线地址: www.passjava.cn

如何监控线程池

用一个 printStats 方法实现了最简陋的监控,每秒输出一次线程池的基本内部信息:

private void printStats(ThreadPoolExecutor threadPool) {
   Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
        log.info("=========================");
        log.info("Pool Size: {}", threadPool.getPoolSize());
        log.info("Active Threads: {}", threadPool.getActiveCount());
        log.info("Number of Tasks Completed: {}", threadPool.getCompletedTaskCount());
        log.info("Number of Tasks in Queue: {}", threadPool.getQueue().size());

        log.info("=========================");
    }, 0, 1, TimeUnit.SECONDS);
}

getPoolSize():获取线程池的线程数量。如果线程池不销毁的话,线程池里的线程不会自动销毁。

getActiveCount():获取活跃的线程数。

getCompletedTaskCount:获取线程池再运行过程中已完成的任务数量。

getQueue().size():获取队列中还有多少积压任务。

线程池生命周期包括

  • RUNNING:接收新的任务并处理队列中的任务
  • SHUTDOWN:不接收新的任务,但是处理队列中的任务
  • STOP:不接收新的任务,不处理队列中的任务,同时中断处理中的任务
  • TIDYING:所有的任务处理完成,有效的线程数是0
  • TERMINATED:terminated() 方法执行完毕。

生命周期状态和方法对应的关系:

作者简介:悟空,8年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:悟空聊架构

悟空的开源项目

https:///Jackson0714/PassJava-Platform