我在Spring中使用ThreadPoolTaskExecutor來安排我的任務。列出ThreadPoolTaskExecutor中的所有正在運行/排隊的線程
有沒有辦法獲得該任務執行程序/池的每個運行和排隊線程的列表或其他東西?
我在Spring中使用ThreadPoolTaskExecutor來安排我的任務。列出ThreadPoolTaskExecutor中的所有正在運行/排隊的線程
有沒有辦法獲得該任務執行程序/池的每個運行和排隊線程的列表或其他東西?
也許不是很優雅,但是這樣我就可以從已知的執行程序獲取所有線程(使用前綴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);
}
}
}
感謝安業的提示,我贊成他的接近獲得排隊的線程。
它看起來像你可以通過調用getThreadPoolExecutor得到底層ThreadPoolExecutor。
這將允許您至少訪問隊列。
一種可能的方式是使用反射或Spring提供ReflectionUtils或ReflectionTestUtils ..
我用ReflectionTestUtils在我的Junit測試場景當一個或多個線程睡眠被中斷。
的代碼片段是:
Collection<Object> workers = (Collection<Object>) ReflectionTestUtils.getField(responseHandlerTaskExecutor.getThreadPoolExecutor(), "workers");
for(Object worker : workers){
Thread workerThread = (Thread)ReflectionTestUtils.getField(worker, "thread");
workerThread.interrupt();
}
你想實現什麼? 'getActiveCount()'返回正確活動線程的數量。 'getPoolSize()'返回池中的線程數。你還需要什麼?爲什麼? –
'ThreadPoolTaskExecutor#.getThreadPoolExecutor()。getQueue()'states _Returns這個執行器使用的任務隊列。訪問任務隊列主要用於調試和監視。該隊列可能處於活動狀態。檢索任務隊列不會阻止排隊的任務執行._ –
@JBNizet我想知道我的應用程序中發生了什麼;) –