2011-01-05 22 views
3

Ich bin mir sicher, dass ich etwas zusammenhacken könnte, was es mir ermöglichen würde, das herauszufinden, aber ich hoffe, dass es eine Out-of-the-Box-Lösung gibt, die ich gerade vermisse. Ich habe die Dokumente gelesen, aber ich habe nichts gesehen.Gibt es eine einfache Möglichkeit zu sagen, welche Aufgaben ein Java Executor zu einem bestimmten Zeitpunkt ausführt?

Meine spezifische App verwendet eine ThreadPoolExecutor unterstützt durch eine DelayQueue, obwohl ich nicht sicher bin, ob das wichtig ist.

Danke!

Antwort

6

Ich glaube nicht, dass es eine zuverlässige Möglichkeit, dies zu tun (Die jvisualvm können auch CPU/Memory Profilieren, mit der Ausführung & Zuordnung Hotspots und zeigen Garbage Collection-Aktivität in Echtzeit. Ausführen). Wenn Sie zählen wollen, gibt es Methoden (getTaskCount()/getCompletedTaskCount()), die Ihnen helfen. Wenn Sie die eigentlichen Aufgaben benötigen, dann müssen Sie AFAIK manuell verfolgen, indem Sie vor execute() und afterExecute() in eine Richtung übergehen.

+0

Sehr direkt und direkt beantwortet meine Frage. Vielen Dank! –

10

Ein einfacher Ansatz: wickeln Sie Ihre Aufgaben mit Code, der Rückruf nennen Start neuer Aufgabe signalisiert, zusammen alle Daten geben Sie es wollen:

interface StartTaskWatcher { 
    void taskStarted(Object data); 
} 

class StartTaskSignalingWrapper implements Runnable { 
    private final Runnable task; 
    private final String taskDescription; 
    private final StartTaskWatcher startTaskWatcher; 

    StartTaskSignalingWrapper(Runnable task, String taskDescription, StartTaskWatcher startTaskWatcher) { 
     this.task = task; 
     this.taskDescription = taskDescription; 
     this.startTaskWatcher = startTaskWatcher; 
    } 

    public void run() { 
     startTaskWatcher.taskStarted(taskDescription); 
     task.run(); 
    } 
} 
+0

Guter Vorschlag, guter Code, danke! –

1

Haben Sie tatsächlich benötigen, um zur Laufzeit kennen, oder nur zum Debuggen?

Wenn Sie gerade debuggen, sollten Sie einen Blick auf die JVisualVM-Anwendung werfen (die im Verzeichnis 'bin' des JDK installiert ist). Sie können alle laufenden Threads dynamisch überprüfen, sodass Sie einige Einblicke erhalten können.

+0

Ich brauche es tatsächlich zur Laufzeit, für die Überwachung und Fehlerbehebung. Gute Info, danke! –