2013-08-16 29 views
6

我在Spring中使用ThreadPoolTask​​Executor來安排我的任務。列出ThreadPoolTask​​Executor中的所有正在運行/排隊的線程

有沒有辦法獲得該任務執行程序/池的每個運行和排隊線程的列表或其他東西?

+0

你想實現什麼? 'getActiveCount()'返回正確活動線程的數量。 'getPoolSize()'返回池中的線程數。你還需要什麼?爲什麼? –

+1

'ThreadPoolTask​​Executor#.getThreadPoolExecutor()。getQueue()'states _Returns這個執行器使用的任務隊列。訪問任務隊列主要用於調試和監視。該隊列可能處於活動狀態。檢索任務隊列不會阻止排隊的任務執行._ –

+1

@JBNizet我想知道我的應用程序中發生了什麼;) –

回答

2

也許不是很優雅,但是這樣我就可以從已知的執行程序獲取所有線程(使用前綴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); 
    } 
    } 
} 

感謝安業的提示,我贊成他的接近獲得排隊的線程。

0

一種可能的方式是使用反射或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(); 
} 
相關問題