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

时间:2019-04-24 16:11:32

标签: java threadpool executorservice

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

故意有多余的线程池配置,我想获得一些有关线程池利用率的度量(即,此时池中20%的线程是空闲的,这时有30%的线程是空闲的)忙)。

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

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

1 个答案:

答案 0 :(得分:0)

以下所有有关:

package java.util.concurrent;

如果可以绕过工厂方法并直接创建“ ThreadPoolExecutor”实例,那么可以使用监视器线程并调用“ ThreadPoolExecutor.getActiveCount”(其他有用的方法)来告知线程池状态。

不幸的是,“执行器”上的工厂方法没有公开“ ThreadPoolExecutor”:返回类型是“ ExecutorService”,并且没有公开必要的方法。您将必须直接实例化线程池执行程序。

我正在寻找可重写的方法,这些方法将在线程池启动线程或托管线程停止时运行,并且找不到任何有用的非私有方法。否则,使用覆盖显示线程池状态的那些方法的子类化线程池将是监视线程池状态的另一种方式,不需要监视线程。

public class Executors {
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

public interface ExecutorService extends Executor {

public interface Executor {

public abstract class AbstractExecutorService implements ExecutorService {

public class ThreadPoolExecutor extends AbstractExecutorService {
    /**
     * Returns the approximate number of threads that are actively
     * executing tasks.
     *
     * @return the number of threads
     */
    public int getActiveCount();