7

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

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

4

3 回答 3

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 的提示,我赞成他获取排队线程的方法。

于 2013-08-16T21:18:55.507 回答
0

看起来您可以通过调用getThreadPoolExecutor来获取底层ThreadPoolExecutor

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

于 2013-08-16T15:33:59.250 回答
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();
}
于 2014-04-15T06:53:15.617 回答