我在 Spring 中使用 ThreadPoolTaskExecutor 来安排我的任务。
有没有办法获取该任务执行器/池的每个正在运行和排队的线程的列表或其他内容?
我在 Spring 中使用 ThreadPoolTaskExecutor 来安排我的任务。
有没有办法获取该任务执行器/池的每个正在运行和排队的线程的列表或其他内容?
也许不是很优雅,但这样我可以从已知的 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 的提示,我赞成他获取排队线程的方法。
看起来您可以通过调用getThreadPoolExecutor来获取底层ThreadPoolExecutor。
至少,这将允许您访问队列。
一种可能的方法是使用 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();
}