2017-10-09 3 views
0

다중 스레드 코드에서 성능 문제를 디버깅하려고하는데 현재이 메서드를 실행중인 스레드 수를 인쇄하는 방법이 있는지 궁금합니다. 작업이 제출되고, 그래서 다음과 같이 구체적으로, 나는 가능한 ThreadPoolExecutor를 사용하고현재 메서드를 실행하는 스레드 수를 얻는 방법은 무엇입니까?

public void concurrentMethod(Object data) { 
    int numberOfThreadsExecutingThisMethodSimulataneously = //...? 
    System.out.println(numberOfThreadsExecutingThisMethodSimulataneously); 
    //method body... 
} 

:

ExecutorService executor; 
for (Object data : myData) { 
    executor.execute(() -> concurrentMethod(data)); 
} 
+0

무엇이다하는 방법 예를 들어, 나는 다음과 같은 있다고 가정 에 대한? 아마도'Thread.currentThread()'를 출력하는 간단한 로그가 충분할 수도있다. – elias

+0

정적 집합을 유지하고 메서드 시작 부분에 스레드 이름을 추가하고 끝에 제거 할 수 있습니다. – lexicore

+0

스레드 풀이 제한되어 있습니까? [API] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)는 몇 가지 stat 메소드를 제공하고 후크 메소드에 대해 설명하므로 AtomicInteger를 사용하여 추적 할 수 있습니다. –

답변

1

에 대한

static AtomicInteger currentNumberOfThreads = new AtomicInteger(); 
public void concurrentMethod(Object data) { 
    currentNumberOfThreads.incrementAndGet(); 
    try { 
    // currentNumberOfThreads.gets() 
    } finally { 
    currentNumberOfThreads.decrementAndGet(); 
    } 
} 
+0

Spring을 사용한다면, 이것은 Aspect의 일일 것입니다. – daniu

+1

좀 더 명확히하기 위해서 : 메소드의 첫 번째 줄에서'System.out.println (currentNumberOfThreads.incrementAndGet()); '과 같은 것을 호출하고 마지막 줄에서'currentNumberOfThreads.decrementAndGet();를 호출해야합니까? –

+0

@SinaMadani 예 –