2017-10-09 70 views
0

我試圖調試多線程代碼中的性能問題,我想知道是否有一種方法可以打印出當前執行該方法的線程數。例如,假設我有以下幾點:如何獲得執行當前方法的線程數?

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

具體地說,我使用的是ThreadPoolExecutor的,所以作業提交如下:

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方法,並討論了hook方法,因此可能使用AtomicInteger進行跟蹤。 –

回答

1

如何

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

如果你使用Spring,這將是一個方面的工作。 – daniu

+1

爲了澄清:所以我應該在方法的第一行調用像'System.out.println(currentNumberOfThreads.incrementAndGet());'並在最後一行調用'currentNumberOfThreads.decrementAndGet();'' –

+0

@SinaMadani是的 –

相關問題