列出ThreadPoolTask​​Executor中所有正在运行/排队的线程

时间:2013-08-16 15:27:52

标签: java threadpool java.util.concurrent threadpoolexecutor

我在Spring中使用ThreadPoolTask​​Executor来安排我的任务。

有没有办法获取该任务执行器/池的每个运行和排队线程的列表或内容?

3 个答案:

答案 0 :(得分:3)

也许不是很优雅,但这样我可以从已知的Executor获取所有线程(使用startsWith()前缀)。

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
for (Thread thread : threadSet) {
  if (thread.getName().startsWith("MyExecutor")) {
  System.out.println(thread.getName() + " " + thread.getState());
    for (StackTraceElement s : thread.getStackTrace()) {
      System.out.println(s);
    }
  }
}

感谢Surveon的暗示,我赞成他的approch以获得排队的线程。

答案 1 :(得分:0)

看起来您可以通过调用ThreadPoolExecutor来获取基础getThreadPoolExecutor

这将允许您至少访问队列。

答案 2 :(得分:0)

一种可能的方法是使用Reflection或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();
}