如何从 ThreadPoolExecutor 获取当前 运行 和排队线程的数量?
How to get number of current running and queued threads from ThreadPoolExecutor?
我需要获取 ThreadPoolExecutor 中 运行 个线程的数量,以及队列大小。
我有一个有效的实现(跟踪数组列表中的每个期货并计算未完成的数量):
java.util.concurrent.ArrayBlockingQueue<Runnable> threadpoolQueue =
new java.util.concurrent.ArrayBlockingQueue<Runnable>(10);
ThreadPoolExecutor threadpool = new java.util.concurrent.ThreadPoolExecutor(0,
executingThreads, retryInterval, java.util.concurrent.TimeUnit.MILLISECONDS, threadpoolQueue);
ArrayList<Future> threads = new ArrayList<Future>();
threads.add(threadpool.submit(/*Runnable*/));
//Get Sizes
int threadpoolRunningThreads = 0;
for (Future obj : threads) {
if (!obj.isDone()) {
threadpoolRunningThreads++;
}
}
logger.debug("Merging all threads threadpool.size=" + threadpoolRunningThreads
+ ",threadpool.queue.size="+ threadpoolQueue.size());
这是一种非常笨拙的跟踪线程池的方式,我没有看到线程池中提供任何方法来获取 运行 和排队线程的数量。我想做类似的事情:
threadpool.getIncompletedTaskSize();
threadpool.getQueuedTaskSize();
我能做到吗?或者至少比我的实施更容易?我正在使用 Java 1.6.
也许 ThreadPoolExecutor#getActiveCount()
和 ThreadPoolExecutor#getQueue()#size()
?
我需要获取 ThreadPoolExecutor 中 运行 个线程的数量,以及队列大小。
我有一个有效的实现(跟踪数组列表中的每个期货并计算未完成的数量):
java.util.concurrent.ArrayBlockingQueue<Runnable> threadpoolQueue =
new java.util.concurrent.ArrayBlockingQueue<Runnable>(10);
ThreadPoolExecutor threadpool = new java.util.concurrent.ThreadPoolExecutor(0,
executingThreads, retryInterval, java.util.concurrent.TimeUnit.MILLISECONDS, threadpoolQueue);
ArrayList<Future> threads = new ArrayList<Future>();
threads.add(threadpool.submit(/*Runnable*/));
//Get Sizes
int threadpoolRunningThreads = 0;
for (Future obj : threads) {
if (!obj.isDone()) {
threadpoolRunningThreads++;
}
}
logger.debug("Merging all threads threadpool.size=" + threadpoolRunningThreads
+ ",threadpool.queue.size="+ threadpoolQueue.size());
这是一种非常笨拙的跟踪线程池的方式,我没有看到线程池中提供任何方法来获取 运行 和排队线程的数量。我想做类似的事情:
threadpool.getIncompletedTaskSize();
threadpool.getQueuedTaskSize();
我能做到吗?或者至少比我的实施更容易?我正在使用 Java 1.6.
也许 ThreadPoolExecutor#getActiveCount()
和 ThreadPoolExecutor#getQueue()#size()
?