如何计算每个线程调用函数的次数?

时间:2016-07-26 09:01:20

标签: java thread-local java-threads

如何计算每个线程调用函数的次数?

假设有很多流,它们调用相同的函数。我必须更改它们才能传递一些参数,这将保持调用次数。但我正在寻找不修改函数签名的方法,而是保留线程局部变量并在一段时间内打印它的值。

3 个答案:

答案 0 :(得分:1)

我猜你可以使用简单的同步块

来做到这一点
//a counter declared in your class
private static int counter;

...
...

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


        //rest of your logic
        ...
    }  
}

答案 1 :(得分: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;
    }
}

答案 2 :(得分:-1)

Vardan Hovhannisyan

你必须在函数或方法中使用synchronized变量,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++;
      }
}