2016-07-26 75 views
0

如何計算每個線程調用函數的次數?如何計算每個線程調用函數的次數?

所以假設有很多流程調用了相同的功能。我必須改變它們以傳遞一些參數,這將保持呼叫的數量。但我正在尋找不修改函數簽名的方法,而是保留線程局部變量並在一段時間內打印其值。

回答

1

我想你可以使用簡單的同步塊

//a counter declared in your class 
private static int counter; 

... 
... 

public void someMethod foo() { 
     synchronized(counter){ 
      counter++; 
     } 


     //rest of your logic 
     ... 
    } 
} 
0

如果你想算時間的方法被稱爲總數,你可以使用一個靜態的AtomicInteger或AtomicLong的做到這一點。

class C { 
    private static final AtomicInteger count = new AtomicInteger(); 
    public void m() { 
     count.getAndIncrement(); 
     //... the rest of the method 
    } 
    public static void getCount() { 
     return count.get(); 
    } 
} 

如果你想保留一個單獨計數爲每個線程,你需要地圖專櫃

class C { 
    private static final ConcurrentHashMap<Long, AtomicInteger> counts = new ConcurrentHashMap<>(); 
    void m() { 
     counts.putIfAbsent(Thread.currentThread().getId(), new AtomicInteger(0)); 
     counts.get(Thread.currentThread().getId()).getAndIncrement(); 
     //... the rest of the method 
    } 

    public static Map<Long, AtomicInteger> getCount() { 
     return counts; 
    } 
} 
-1

瓦爾班·霍維漢尼斯恩

必須使用同步的函數或方法內部變量,sycrhonize有必要在執行和計數期間不要在線程之間進行爭奪,以確保正確的價值。

public class exemplesyn { 
     //Count variable 
     private Integer countsychronized =0; 

     //Methode to count execution 
     public void executedmethodeToCount(){ 
      this.countSychronized(); 
      //Code to execute 
     } 

     //Synchroniced methode to count 
     public synchronized void countSychronized(){ 
     this.countsychronized++; 
     } 
} 
相關問題