Spring에서 ThreadPoolTaskExecutor를 사용하여 작업을 예약합니다.ThreadPoolTaskExecutor의 실행중인/대기중인 모든 스레드 나열
해당 작업 실행자/풀의 실행중인 모든 스레드와 대기중인 스레드의 목록 또는 일부를 가져 오는 방법이 있습니까?
Spring에서 ThreadPoolTaskExecutor를 사용하여 작업을 예약합니다.ThreadPoolTaskExecutor의 실행중인/대기중인 모든 스레드 나열
해당 작업 실행자/풀의 실행중인 모든 스레드와 대기중인 스레드의 목록 또는 일부를 가져 오는 방법이 있습니까?
아마도 매우 우아하지는 않지만이 방법을 사용하면 알려진 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.
ThreadPoolExecutor에있는 전화 번호는 getThreadPoolExecutor입니다.
이렇게하면 최소한 큐에 액세스 할 수 있습니다.
한 가지 가능한 방법은
나는 하나 개 이상의 수면 스레드가 중단 될 때 시나리오를 테스트하려면 내 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();
}
이 무엇을 달성하고자합니까? 'getActiveCount()'는 올바르게 작동하는 쓰레드의 수를 반환합니다. 'getPoolSize()'는 풀에있는 쓰레드의 수를 반환한다. 무엇이 더 필요합니까? 그리고 왜? –
'ThreadPoolTaskExecutor # .getThreadPoolExecutor(). getQueue()'상태 _이 executor가 사용하는 태스크 큐를 돌려줍니다. 태스크 대기열에 대한 액세스는 주로 디버깅 및 모니터링을위한 것입니다. 이 대기열이 활성 상태 일 수 있습니다. 작업 대기열을 가져 오더라도 대기중인 작업이 실행되는 것을 막을 수는 없습니다. _ –
@JBNizet 내 응용 프로그램에서 무슨 일이 일어나는지 알고 싶습니다;) –