首页 > 解决方案 > 监控 Java 线程池队列 - 如何知道队列大小以及任务在那里花费了多长时间?

问题描述

监控 Java 线程池队列 - 如何知道队列大小以及任务在那里花费了多长时间?

我有一个构造如下的线程池:

int corePoolSize = 10;
int maximumPoolSize = 10;
long keepAliveTime = 0L;
TimeUnit unit = MILLISECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<T>();
ThreadFactory threadFactory = new MyCustomThreadFactory();
RejectedExecutionHandler rejectedExecutionHandler = new MyRejectedExecutionHandler();

ExecutorService executorService = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, rejectedExecutionHandler);

我正在使用它,它工作正常,但可观察性很差。我想知道我目前不知道的事情:

1. 每次插入一个任务workQueue,表示池已满,我想知道队列有多大。

为此,我将 LinkedBlockingQueue 包装在我自己的队列实现中,如果有东西提供给队列,我将在其中执行一些代码。

2. 在一个任务真正开始之前,我想知道它在队列中停留了多长时间,同时有多少并行任务在运行。

我还没有找到一个干净的解决方案。

我想知道在做这件事上是否有一些好的做法?理想情况下,我希望对这些信息进行一些回调,这样我就可以决定如何处理这些指标(记录它,将它发送到某个监控服务等......)

标签: javathreadpoolexecutor

解决方案


为此,我将 LinkedBlockingQueue 包装在我自己的队列实现中,如果有东西提供给队列,我将在其中执行一些代码。

您可以随时使用ThreadPoolExecutor.getQueue()方法并获取队列的大小。所以你不需要有自己的队列实现。

在任务开始之前,我想知道在此之前它在队列中停留了多长时间以及同时运行了多少并行任务。

这样的问题只能使用额外的数据结构来解决,因为您需要知道任务入队和出队的时间。但是,我相信,您不需要知道特定任务在队列中停留了多长时间。实际上,您通常需要知道一些汇总时间。只是一个想法,当队列大小大于零或其他值时,您可以使用队列大小并计算不变有效性的时间。您可以使用beforeExecute()afterExecute()回调来实现理想的功能。


推荐阅读