> 文档中心 > Java线程池监控应用

Java线程池监控应用

线程池是我们平时开发中使用较多的一种组件,其主要监控点在于池中的线程和阻塞队列中的任务情况

构建一个线程池

先构建一个基本的线程池,并看看有哪些参数我们可以直接获取到

public class ThreadPoolMonitor {    private final static Logger log = LoggerFactory.getLogger(ThreadPoolMonitor.class);    private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 0,     TimeUnit.SECONDS, new LinkedBlockingQueue<>(100),     new ThreadFactoryBuilder().setNameFormat("my_thread_pool_%d").build());    public static void main(String[] args) { log.info("Pool Size: " + threadPool.getPoolSize()); log.info("Active Thread Count: " + threadPool.getActiveCount()); log.info("Task Queue Size: " + threadPool.getQueue().size()); log.info("Completed Task Count: " + threadPool.getCompletedTaskCount());    }}
[main] INFO thread.ThreadPoolMonitor - Pool Size: 0[main] INFO thread.ThreadPoolMonitor - Active Thread Count: 0[main] INFO thread.ThreadPoolMonitor - Task Queue Size: 0[main] INFO thread.ThreadPoolMonitor - Completed Task Count: 0[main] INFO thread.ThreadPoolMonitor - Completed Task Count: 0

定时监控

加上定时一秒一次的任务来监控,线程池的使用情况

public class ThreadPoolMonitor {    private final static Logger log = LoggerFactory.getLogger(ThreadPoolMonitor.class);    private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 0,     TimeUnit.SECONDS, new LinkedBlockingQueue<>(100),     new ThreadFactoryBuilder().setNameFormat("my_thread_pool_%d").build(), new ThreadPoolExecutor.DiscardOldestPolicy());    public static void main(String[] args) {    // 每秒输出一次线程池的使用情况 printThreadPoolState(); // 模拟任务执行 IntStream.rangeClosed(0, 20).forEach(i -> { // 每100毫秒,执行一个任务     try {  TimeUnit.MILLISECONDS.sleep(100);     } catch (InterruptedException e) {  e.printStackTrace();     }     // 每个处理一个任务耗时5秒     threadPool.submit(() -> {  try {      TimeUnit.SECONDS.sleep(5);  } catch (InterruptedException e) {      e.printStackTrace();  }     }); });    }    private static void printThreadPoolState() { Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {     log.info("Pool Size: " + threadPool.getPoolSize());     log.info("Active Thread Count: " + threadPool.getActiveCount());     log.info("Task Queue Size: " + threadPool.getQueue().size());     log.info("Completed Task Count: " + threadPool.getCompletedTaskCount());     log.info("---------------"); }, 0, 1, TimeUnit.SECONDS);    }}