6

Spring에서 ThreadPoolTaskExecutor를 사용하여 작업을 예약합니다.ThreadPoolTaskExecutor의 실행중인/대기중인 모든 스레드 나열

해당 작업 실행자/풀의 실행중인 모든 스레드와 대기중인 스레드의 목록 또는 일부를 가져 오는 방법이 있습니까?

+0

이 무엇을 달성하고자합니까? 'getActiveCount()'는 올바르게 작동하는 쓰레드의 수를 반환합니다. 'getPoolSize()'는 풀에있는 쓰레드의 수를 반환한다. 무엇이 더 필요합니까? 그리고 왜? –

+1

'ThreadPoolTaskExecutor # .getThreadPoolExecutor(). getQueue()'상태 _이 executor가 사용하는 태스크 큐를 돌려줍니다. 태스크 대기열에 대한 액세스는 주로 디버깅 및 모니터링을위한 것입니다. 이 대기열이 활성 상태 일 수 있습니다. 작업 대기열을 가져 오더라도 대기중인 작업이 실행되는 것을 막을 수는 없습니다. _ –

+1

@JBNizet 내 응용 프로그램에서 무슨 일이 일어나는지 알고 싶습니다;) –

답변

2

아마도 매우 우아하지는 않지만이 방법을 사용하면 알려진 Executor (startsWith() 접두사 사용)에서 모든 스레드를 가져올 수 있습니다. 자신의 힌트 Surveon에

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); 
    } 
    } 
} 

덕분에, 나는 대기중인 스레드를 얻기 위해 자신의 approch에 대한 upvoted.

0

한 가지 가능한 방법은

나는 하나 개 이상의 수면 스레드가 중단 될 때 시나리오를 테스트하려면 내 Junit와의 ReflectionTestUtils을 사용 .. 반사 또는 봄 제공 ReflectionUtils 또는 ReflectionTestUtils을 사용하는 것입니다.

코드 조각은 다음과 같습니다

Collection<Object> workers = (Collection<Object>) ReflectionTestUtils.getField(responseHandlerTaskExecutor.getThreadPoolExecutor(), "workers"); 

for(Object worker : workers){ 
    Thread workerThread = (Thread)ReflectionTestUtils.getField(worker, "thread"); 
    workerThread.interrupt(); 
}