2016-07-26 99 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++; 
     } 
}