スレッドごとに関数が何回呼び出されたかを計算するにはどうすればよいですか?スレッドごとに関数が何回呼び出されたかを計算するにはどうすればよいですか?
したがって、同じ関数を呼び出すフローが多数あるとします。いくつかのパラメータを渡すためにそれらをすべて変更しなければなりません。コールの数を維持します。しかし、私は、関数のシグネチャを変更しない方法を探していますが、代わりにスレッドローカル変数を保持し、しばらくの間その値を表示しています。
スレッドごとに関数が何回呼び出されたかを計算するにはどうすればよいですか?スレッドごとに関数が何回呼び出されたかを計算するにはどうすればよいですか?
したがって、同じ関数を呼び出すフローが多数あるとします。いくつかのパラメータを渡すためにそれらをすべて変更しなければなりません。コールの数を維持します。しかし、私は、関数のシグネチャを変更しない方法を探していますが、代わりにスレッドローカル変数を保持し、しばらくの間その値を表示しています。
は、私はあなたがメソッドが呼び出された回数の合計数をカウントしたい場合は、静的のAtomicIntegerまたはAtomicLongを使用することができます
//a counter declared in your class
private static int counter;
...
...
public void someMethod foo() {
synchronized(counter){
counter++;
}
//rest of your logic
...
}
}
、単純な同期ブロックを使用してそれを行うことができますね。
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;
}
}
ヴァーデイン・ホバニスヤン
あなたは関数やメソッドの内部同期変数を使用しなければならないのマップを必要とし、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++;
}
}