Wie verfolgen Sie Ausführungsstatistiken mit einem ExecutorService?

8

Ich feuere Aufgaben mit einem ExecutorService ab und übergebe Aufgaben, die nach aufgabenspezifischen Kriterien gruppiert werden müssen:

%Vor%

Periodisch möchte ich die durchschnittliche Dauer der einzelnen Aufgaben (gruppiert nach type ) zusammen mit statistischen Informationen wie Mittelwert / Median und Standardabweichung ausgeben.

Dies muss natürlich ziemlich schnell sein und sollte idealerweise nicht dazu führen, dass die verschiedenen Threads beim Melden von Statistiken synchronisiert werden. Was ist eine gute Architektur dafür?

    
Chris R 28.05.2009, 20:38
quelle

4 Antworten

9

ThreadPoolExecutor stellt vorExecute und < a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#afterExecute(java.lang.Runnable,%20java.lang.Throwable)"> afterExecute Methoden, die Sie überschreiben können. Sie können diese verwenden, um Ihre Statistiken in einer einzigen (Mitgliedsvariable Ihres ExecutorService) aufzuzeichnen. ConcurrentHashMap hat eine eindeutige Kennung für Ihre Aufgaben eingegeben und den Typ, die Startzeit und die Endzeit gespeichert.

Berechne die Statistiken von ConcurrentHashMap , wenn du bereit bist, sie anzusehen.

    
Adam Jaskiewicz 28.05.2009, 20:50
quelle
4

Unterklasse Thread Pool Executor und verfolgen Sie die Ausführungsereignisse :

Beachten Sie, dass die Methoden vom Worker-Thread aufgerufen werden, der die Task ausführt. Daher müssen Sie die Thread-Sicherheit für den Ausführungsverfolgungscode sicherstellen.

Auch die Runnables, die Sie erhalten, sind höchstwahrscheinlich nicht Ihre Runnables, sondern in FutureTasks verpackt.

    
Robert Munteanu 28.05.2009 20:51
quelle
2

Eine andere Möglichkeit ist Wrapper / Decorator Pattern.

%Vor%     
leef 03.08.2011 08:31
quelle
1

Ich glaube, dass die zwei anderen Antworten richtig sind, aber vielleicht ein bisschen zu kompliziert (obwohl meine Antwort, obwohl einfach, ist wahrscheinlich nicht ganz so leistungsfähig wie ihre.

Warum verwenden Sie nicht einfach Atomic-Variablen, um Ihre Statistiken zu verfolgen? Wie die Anzahl der ausgeführten Tasks, die gesamte Ausführungszeit (geteilt durch die Gesamtzahl, erhalten Sie die durchschnittliche Ausführungszeit). Übergeben Sie diese Variablen für jede Aufgabe in Ihre Runnable. Sofern Ihre Aufgaben nicht extrem kurzlebig sind, glaube ich nicht, dass der Aufwand für das Sperren einer Atomic-Variablen Auswirkungen auf Sie haben wird.

    
Gandalf 28.05.2009 22:01
quelle