2016-07-26 10 views
0

Wie kann ich berechnen, wie oft die Funktion für jeden Thread aufgerufen wurde?Wie kann ich berechnen, wie oft die Funktion für jeden Thread aufgerufen wurde?

Angenommen, es gibt viele Flüsse, die die gleiche Funktion aufrufen. Ich muss sie alle ändern, um einen Parameter zu übergeben, der die Anzahl der Anrufe hält. Aber ich suche nach Möglichkeiten, die Signatur der Funktionen nicht zu ändern, sondern lokale Thread-Variablen beizubehalten und ihren Wert von Zeit zu Zeit zu drucken.

Antwort

1

Ich denke, man kann es tun einfach synchronisierten Block

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

... 
... 

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


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

Wenn Sie die Gesamtzahl der für ein Verfahren zählen möchten genannt wurde, eine statische oder Atomicinteger Atomic verwenden können.

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(); 
    } 
} 

Wenn Sie eine separate Zählung für jeden Thread behalten möchten, müssen Sie eine Karte von Zählern

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

Vardan Hovhannisyan

Sie müssen sycrhonize innerhalb der Funktion oder Methode, Variable synchronisiert verwenden Es ist notwendig, zwischen Threads während des Ausführens und Zählens nicht zu springen, um den korrekten Wert zu erhalten.

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++; 
     } 
} 
Verwandte Themen