ThreadPoolExecutor提供了一組方法用于監(jiān)控線程池。
int getActiveCount() 獲得線程池中當(dāng)前活動(dòng)線程的數(shù)量。
long getCompletedTaskCount() 返回線程池完成任務(wù)的數(shù)量。
int getCorePoolSize() 線程池中核心線程的數(shù)量。
int getLargestPoolSize() 返回線程池曾經(jīng)達(dá)到的線程的最大數(shù)。
int getMaximumPoolSize() 返回線程池的最大容量。
int getPoolSize() 當(dāng)前線程池的大小。
BlockingQueue getQueue() 返回阻塞隊(duì)列。
long getTaskCount() 返回線程池收到的任務(wù)總數(shù)。
package com.wkcto.threadpool;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 監(jiān)控線程池
*/
public class Test05 {
public static void main(String[] args) throws InterruptedException {
//先定義任務(wù)
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getId() + " 編號 的線程開始執(zhí)行: " + System.currentTimeMillis());
try {
Thread.sleep(10000); //線程睡眠20秒,模擬任務(wù)執(zhí)行時(shí)長
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//定義線程池
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2, 5, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardPolicy());
//向線程池提交30個(gè)任務(wù)
for (int i = 0; i < 30; i++) {
poolExecutor.submit(r);
System.out.println("當(dāng)前線程池核心線程數(shù)量: " + poolExecutor.getCorePoolSize() + ", 最大線程數(shù):" + poolExecutor.getMaximumPoolSize() + ",當(dāng)前線程池大小:" + poolExecutor.getPoolSize() + ",活動(dòng)線程數(shù)量:" + poolExecutor.getActiveCount()+ ",收到任務(wù)數(shù)量:" + poolExecutor.getTaskCount() + ",完成任務(wù)數(shù): " + poolExecutor.getCompletedTaskCount() + ",等待任務(wù)數(shù):" + poolExecutor.getQueue().size()) ;
TimeUnit.MILLISECONDS.sleep(500);
}
System.out.println("-----------------------------------------------");
while ( poolExecutor.getActiveCount() >= 0 ){
System.out.println("當(dāng)前線程池核心線程數(shù)量: " + poolExecutor.getCorePoolSize() + ", 最大線程數(shù):" + poolExecutor.getMaximumPoolSize() + ",當(dāng)前線程池大小:" + poolExecutor.getPoolSize() + ",活動(dòng)線程數(shù)量:" + poolExecutor.getActiveCount()+ ",收到任務(wù)數(shù)量:" + poolExecutor.getTaskCount() + ",完成任務(wù)數(shù): " + poolExecutor.getCompletedTaskCount() + ",等待任務(wù)數(shù):" + poolExecutor.getQueue().size()) ;
Thread.sleep(1000);
}
}
}