Java 列出ThreadPoolTaskExecutor中所有正在运行/排队的线程

Java 列出ThreadPoolTaskExecutor中所有正在运行/排队的线程,java,threadpool,java.util.concurrent,threadpoolexecutor,Java,Threadpool,Java.util.concurrent,Threadpoolexecutor,我在Spring中使用ThreadPoolTaskExecutor来安排任务 是否有方法获取该任务执行器/池中每个正在运行和排队的线程的列表或其他内容?看起来您可以通过调用来获取底层线程 这至少允许您访问队列。可能不是很优雅,但通过这种方式,我可以从已知的执行器获取所有线程(使用startsWith()前缀) Set threadSet=Thread.getAllStackTraces().keySet(); 用于(螺纹:螺纹组){ if(thread.getName().startsWith(

我在Spring中使用ThreadPoolTaskExecutor来安排任务


是否有方法获取该任务执行器/池中每个正在运行和排队的线程的列表或其他内容?

看起来您可以通过调用来获取底层线程


这至少允许您访问队列。

可能不是很优雅,但通过这种方式,我可以从已知的执行器获取所有线程(使用
startsWith()
前缀)

Set threadSet=Thread.getAllStackTraces().keySet();
用于(螺纹:螺纹组){
if(thread.getName().startsWith(“MyExecutor”)){
System.out.println(thread.getName()+“”+thread.getState());
对于(StackTraceElement s:thread.getStackTrace()){
系统输出打印项次;
}
}
}

多亏了Surveon的提示,我对他获取排队线程的方法投了赞成票。

一种可能的方法是使用反射或Spring提供的ReflectionUtils或ReflectionTestUtils

我在Junit中使用ReflectionTestUtils来测试一个或多个睡眠线程中断时的场景

代码片段是:

Collection<Object> workers = (Collection<Object>) ReflectionTestUtils.getField(responseHandlerTaskExecutor.getThreadPoolExecutor(), "workers");

for(Object worker : workers){
    Thread workerThread = (Thread)ReflectionTestUtils.getField(worker, "thread");
    workerThread.interrupt();
}
Collection workers=(Collection)ReflectionTestUtils.getField(responseHandlerTaskExecutor.getThreadPoolExecutor(),“workers”);
用于(对象辅助对象:辅助对象){
线程workerThread=(Thread)ReflectionTestUtils.getField(worker,“Thread”);
workerThread.interrupt();
}

您希望实现什么目标
getActiveCount()
返回当前活动线程的数量
getPoolSize()
返回池中的线程数。你还需要什么?为什么?
ThreadPoolTaskExecutor#。getThreadPoolExecutor().getQueue()
状态返回此执行器使用的任务队列。对任务队列的访问主要用于调试和监视。此队列可能正在使用中。检索任务队列不会阻止队列中的任务执行。@JBNizet我想知道我的应用程序中发生了什么;)
Collection<Object> workers = (Collection<Object>) ReflectionTestUtils.getField(responseHandlerTaskExecutor.getThreadPoolExecutor(), "workers");

for(Object worker : workers){
    Thread workerThread = (Thread)ReflectionTestUtils.getField(worker, "thread");
    workerThread.interrupt();
}