我在Spring中使用ThreadPoolTaskExecutor来安排我的任务。
有没有办法获取该任务执行器/池的每个运行和排队线程的列表或内容?
答案 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();
}