如何检查固定线程池的利用率

Leo*_*Leo 2 java executorservice threadpool

我正在运行一个使用固定线程池的 Java 应用程序,其中线程用于向外部服务发出 HTTP 请求。

线程池被故意过度配置,我想获得一些线程池利用率的测量结果(即,此时池中 20% 的线程空闲,而此时 30% 的线程忙碌)。

是否有一种有效的方法来检查线程池(通过 Executors.newFixedThreadPool(x) 创建)当前正在执行任务的比例?

我曾考虑过创建一个特殊的监视器线程来持续运行可调用任务,报告利用率,但我不确定这是否会影响线程池本身的性能(通过使线程响应监视器而不是进行 HTTP 调用) )。

Tho*_*nti 6

ExecutorService#newFixedThreadPool(int nThreads)返回 ExecutorService 的实例,但是如果您查看源代码,您会发现它们基本上创建了ThreadPoolExecutor的新实例并将其转换为 ExecutorService。

所以你可以这样做:

final int poolSize = 15; // your thread pool size
final ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(poolSize);
Run Code Online (Sandbox Code Playgroud)

在此 ThreadPoolExecutor 实例上,您可以使用 Javadocs 中可以找到的多种方法之一:https: //docs.oracle.com/javase/10/docs/api/java/util/concurrent/ThreadPoolExecutor.html#method。概括

仅举几个您可能会觉得有用的:
- ThreadPoolExecutor#getActiveCount
- ThreadPoolExecutor#getTaskCount
- ThreadPoolExecutor#getPoolSize