zoukankan      html  css  js  c++  java
  • 干货 | 教你如何监控 Java 线程池运行状态

    之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。

    但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等。

    如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数、正在排队中的线程数、已经执行完成的线程数、总线程数等。

    总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数。

    下面给出一个线程池使用示例,及教你获取线程池状态。

    1. private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS,

    2.            new LinkedBlockingQueue<Runnable>(100000));

    3. public static void main(String[] args) throws Exception {

    4.    for (int i = 0; i < 100000; i++) {

    5.        es.execute(() -> {

    6.            System.out.print(1);

    7.            try {

    8.                Thread.sleep(1000);

    9.            } catch (InterruptedException e) {

    10.                e.printStackTrace();

    11.            }

    12.        });

    13.    }

    14.    ThreadPoolExecutor tpe = ((ThreadPoolExecutor) es);

    15.    while (true) {

    16.        System.out.println();

    17.        int queueSize = tpe.getQueue().size();

    18.        System.out.println("当前排队线程数:" + queueSize);

    19.        int activeCount = tpe.getActiveCount();

    20.        System.out.println("当前活动线程数:" + activeCount);

    21.        long completedTaskCount = tpe.getCompletedTaskCount();

    22.        System.out.println("执行完成线程数:" + completedTaskCount);

    23.        long taskCount = tpe.getTaskCount();

    24.        System.out.println("总线程数:" + taskCount);

    25.        Thread.sleep(3000);

    26.    }

    27. }

    线程池提交了 100000 个任务,但同时只有 50 个线程在执行工作,我们每陋 3 秒来获取当前线程池的运行状态。

    第一次程序输出:

    1. 当前排队线程数:99950

    2. 当前活动线程数:50

    3. 执行完成线程数:0

    4. 总线程数(排队线程数 + 活动线程数 +  执行完成线程数):100000

    第二次程序输出:

    1. 当前排队线程数:99800

    2. 当前活动线程数:50

    3. 执行完成线程数:150

    4. 总线程数(排队线程数 + 活动线程数 +  执行完成线程数):100000

    活动线程数和总线程数是不变的,排队中的线程数和执行完成的线程数不断在变化,直到所有任务执行完毕,最后输出:

    1. 当前排队线程数:0

    2. 当前活动线程数:0

    3. 执行完成线程数:100000

    4. 总线程数(排队线程数 + 活动线程数 +  执行完成线程数):100000

    这样,你了解了这些 API 的使用方法,你想监控线程池的状态就非常方便了。

    大家有什么问题在下边留言,想深入交流学习的也可以点击左下方的阅读原文链接加入 Java 技术知识星球。目前知识星球 5.1劳动节-5.4 青年节优惠活动最后6个小时啦,错过今天再等半年……

  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/cxxjohnson/p/10518428.html
Copyright © 2011-2022 走看看