线程池介绍

  什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等

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

       如果你想监控某一个线程池的执行状态,线程池执行类 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

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

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

最新文章

  1. 靠谱的datatable转json方法
  2. python第一天
  3. CentOS6.8下部署Zabbix3.0
  4. Hadoop 文件的数量怎么比block的数量多?
  5. 第十二届浙江省大学生程序设计大赛-Lunch Time 分类: 比赛 2015-06-26 14:30 5人阅读 评论(0) 收藏
  6. Android中如何取消调转界面后EditText默认获取聚焦问题
  7. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-008-带参数的ADVICE
  8. Python 学习之urllib模块---用于发送网络请求,获取数据
  9. Matlab与DSP联合开发
  10. 【内部竞聘】华东/华南 -区域招商高级经理/经理 - 荐才纳贤 - 京东内部论坛 - Powered by Discuz!
  11. ASP.NET WEB API 如何使用基于Post的方式传递多个值(二)
  12. hdu4300之KMP&amp;&amp;EKMP
  13. Self Hosting WebServer 的几种方式
  14. js导出excel文件
  15. SQL*Plus工具
  16. uCrop图片裁剪
  17. Python 多线程、多进程 (一)之 源码执行流程、GIL
  18. BZOJ.2938.[POI2000]病毒(AC自动机)
  19. 根据twitter的snowflake算法生成唯一ID
  20. JavaWeb 返回json数据的两种方式

热门文章

  1. C语言如何打印出%
  2. 从0构建webpack开发环境(三) 开发环境以及 webpack-dev-server 的使用
  3. RabbitMQ ——与Spring集成及exchange的direct、topic方式实现和简单队列实现
  4. Failed to load C:\ProgramFilesTwo\Android\sdk\build-tools\27.0.3\lib\dx.jar
  5. CentOS7.6系统安装zabbix3.4.8客户端
  6. ERROR- 开发常见error
  7. Oracle数据库同义词
  8. Java虚拟机(JVM)与垃圾回收机制(GC)的详解
  9. count(1)、count(*)、count(字段)的区别
  10. 51nod 1714:B君的游戏(博弈 sg打表)