Benachrichtigung beim Starten von Threads

Status
Nicht offen für weitere Antworten.

Babba_BLuBB

Aktives Mitglied
Hallo zusammen.

Gibt es in Java eine Möglichkeit, sich beim Starten eines Threads benachrichtigen zu lassen?

Also so was im Sinne des Observer-Patterns?
Ich möchte benachrichtigt werden, wann immer ein Thread startet.

Viele Grüße und danke
 
S

SlaterB

Gast
jo, implementiere das Observer-Pattern, dann hast du das Observer-Pattern,
vorhanden ist dazu noch nichts meiner Kenntnis nach
 

JPKI

Top Contributor
Du könntest einen separaten Thread starten und darin in einem festgelegten Zeitintervall jstack als externen Prozess aufrufen und die Ergebnisse auslesen. Wenn sich die Anzahl der Threads um eins erhöht hat, weisst du's...
OK, ist nicht sehr performant^^
 

EgonOlsen

Bekanntes Mitglied
JPKI hat gesagt.:
Du könntest einen separaten Thread starten und darin in einem festgelegten Zeitintervall jstack als externen Prozess aufrufen und die Ergebnisse auslesen. Wenn sich die Anzahl der Threads um eins erhöht hat, weisst du's...
OK, ist nicht sehr performant^^
Das geht auch besser. Als Starthilfe:

Code:
import java.util.*;

public class Theader {

    private List<String> threadsRunning = new ArrayList<String>();

    public static void main(String[] args) {
        Theader theader = new Theader();
        List<String> threads=theader.collect();
        for (String str:threads) {
            System.out.println(str);
        }
    }

    public List<String> collect() {
        ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
        while (root.getParent() != null) {
            root = root.getParent();
        }
        collectThreads(root);
        return threadsRunning;
    }

    private void collectThreads(ThreadGroup root) {
        collectThreads(root, 0);
    }

    private void collectThreads(ThreadGroup group, int level) {
        Thread[] threads = new Thread[group.activeCount()<<1];
        int numThreads = group.enumerate(threads, false);

        String groupName = group.toString();
        for (int p = 0; p < level; p++) {
            groupName = "\t" + groupName;
        }
        threadsRunning.add(groupName);

        for (int i = 0; i < numThreads; i++) {
            Thread thread = threads[i];
            String threadName = thread.toString();
            for (int p = 0; p < level; p++) {
                threadName = "\t" + threadName;
            }
            threadsRunning.add(threadName);
        }

        ThreadGroup[] groups = new ThreadGroup[group.activeGroupCount()<<1];
        int numGroups = group.enumerate(groups, false);

        for (int i = 0; i < numGroups; i++) {
            collectThreads(groups[i], level + 1);
        }
    }
}
 

Babba_BLuBB

Aktives Mitglied
Hallo zusammen,

schon mal vielen dank für die Vorschläge.
Ich werde den Vorschlag von EgonOlsen mal ausprobieren, der sieht ganz vielversprechend aus...

Hab nur eine Frage zu Zeile 29:
Warum machst du das Array doppelt so groß wie group.activeCount()? Gibts da einen bestimmten Grund oder einfach nur so?

Grüße und danke
 

EgonOlsen

Bekanntes Mitglied
Pffff...das ist eine Weile her, dass ich das mal geschrieben habe. Ich vermute jetzt mal, dass ist ein großzügige Absicherung, wenn zwischen dem activeCount() und dem enumerate noch Threads dazu kommen sollten. Damit die halt nicht verloren gehen in der Ansicht. Das Ding war für einen Webserver, da kann das recht schnell passieren.
 

Babba_BLuBB

Aktives Mitglied
Ach so, OK.

Hab auch eine Entsprechung in der API gefunden:

public int activeCount()
Returns an estimate of the number of active threads in this thread group. The result might not reflect concurrent activity, and might be affected by the presence of certain system threads.

OK, dann hab ich das jetzt auch kapiert...

Grüße und danke
 

Babba_BLuBB

Aktives Mitglied
Ich hab die Idee jetzt in einer eigenen Klasse verbaut.
Die Klasse dient dazu, CPU-Zeiten von Threads festzustellen. Nachfolgend ist meine Lösung abgebildet:

Code:
package unittestenvironment.utils;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * Die Klasse ThreadCPUTimeMonitor dient dem Ermitteln der
 * CPU-Zeit, die von allen Threads des aktuellen Prozesses
 * benoetigt wurde.
 * 
 * Zusaetzlich besteht die Moeglichkeit, einzelne Threads
 * von dieser Betrachtung auszuschliessen. Hierzu kann ein
 * zu ignorierender Thread ueber eine entsprechende
 * Methode an die Klasse ThreadCPUTimeMonitor uebergeben
 * werden.
 * 
 * @author Patrick Fries
 */
public class ThreadCPUTimeMonitor {

    /** Speichert alle Threads und deren ermittelte CPU-Zeit */
    private Map<Thread, MutableLong> threadCPUTimes;

    /** Speichert die Threads, die ignoriert werden sollen */
    private Set<Thread> threadsToIgnore;

    /** Speichert die Wurzel-Thread-Gruppe */
    private ThreadGroup rootThreadGroup;

    /** Dient dem Ermitteln von CPU-Zeiten einzelner Threads */
    private ThreadMXBean threadMXBean;

    
    /**
     * Initialisiert ein neues ThreadCPUTimeMonitor-Objekt.
     */
    public ThreadCPUTimeMonitor() {
        this.threadCPUTimes = new HashMap<Thread, MutableLong>();
        this.threadsToIgnore = new HashSet<Thread>();
        this.rootThreadGroup = this.findRootThreadGroup();
        this.threadMXBean = ManagementFactory.getThreadMXBean();

        this.collectThreads();

        // Dieser Thread ruft in periodischen Abstaenden die Methode
        // collectThreads auf, um staendig nach neuen Threads zu suchen,
        // die noch nicht erfasst wurden
        final Thread collectorThread = new Thread("collector") {
            @Override
            public void run() {
                while (true) {
                    ThreadCPUTimeMonitor.this.collectThreads();

                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        collectorThread.start();
        this.threadsToIgnore.add(collectorThread);
    }

    
    /**
     * Liefert die von allen betracheten Threads bisher benoetigte CPU-Zeit
     * @param printCPUTimes - Bestimmt, ob die CPU-Zeiten der betrachteten Threads 
     *                        auf der Standardausgabe ausgegeben werden
     * @return CPU-Zeit, die von allen betrachteten Threads bisher benoetigt wurde
     */
    public long calculateCPUTimeOfMonitoredThreads(final boolean printCPUTimes) {
        long totalCPUTime = 0;
        synchronized (this.threadCPUTimes) {
            for (final Entry<Thread, MutableLong> entry : this.threadCPUTimes.entrySet()) {
                final Thread currentThread = entry.getKey();
                final MutableLong currentThreadCPUTime = entry.getValue();
                
                // Sollte der betrachtete Thread nicht mehr aktiv sein oder in der
                // Liste der zu ignorierenden Threads vorhanden sein,
                // so wird er hier nicht betrachtet
                final boolean isAlive = currentThread.isAlive();
                final boolean isIgnored = this.threadsToIgnore.contains(currentThread);             
                if (isAlive && !isIgnored) {
                
                    // Aktualisieren der CPU-Zeit des betracheten Threads
                    final long cpuTime = 
                        this.threadMXBean.getThreadCpuTime(currentThread.getId()) / 1000000;
                    if (cpuTime > 0) {
                        currentThreadCPUTime.value = cpuTime;
                    }
                    
                    if (printCPUTimes) {
                        System.out.println(currentThread.getName() + ": " + cpuTime);
                    }
                    
                    // Erhoehen der zu ermittelnden CPU-Zeit aller beobachteten
                    // Threads
                    totalCPUTime += cpuTime;
                
                } else {
                    if (printCPUTimes) {
                        final String prolog = currentThread.getName() + ": "
                            + currentThreadCPUTime.value;
                        if (!isAlive) {
                            System.out.println(prolog + " (DEAD)");
                        } else if (isIgnored) {
                            System.out.println(prolog + " (IGNORED)");
                        } else {
                            System.out.println(prolog + " (UNKNOWN)");
                        }
                    }
                }
            }
        }
        
        if (printCPUTimes) {
            System.out.println("---------------------------");
            System.out.flush();
        }

        return totalCPUTime;
    }

    /**
     * Sucht nach Threads, die noch nicht erfasst wurden
     */
    private void collectThreads() {
        final int estimatedThreadCount = this.rootThreadGroup.activeCount() * 2;
        final Thread[] threads = new Thread[estimatedThreadCount];
        this.rootThreadGroup.enumerate(threads, true);

        synchronized (this.threadCPUTimes) {
            for (final Thread currentThread : threads) {
                if (currentThread == null) {
                    break;
                }

                if (!this.threadCPUTimes.containsKey(currentThread)) {
                    this.threadCPUTimes.put(currentThread, new MutableLong());
                }
            }
        }
    }
    
    /**
     * Fuegt den uebergebenen Thread zur Liste der zu ignorierenden
     * Threads hinzu
     * @param thread - Zu ignorierender Thread
     */
    public void addThreadToIgnore(final Thread thread) {
        synchronized (this.threadCPUTimes) {
            this.threadsToIgnore.add(thread);
        }
    }

    /**
     * Liefert die "oberste" ThreadGroup zurueck
     * @return "oberste" ThreadGroup
     */
    private ThreadGroup findRootThreadGroup() {
        ThreadGroup group = Thread.currentThread().getThreadGroup();
        while (group.getParent() != null) {
            group = group.getParent();
        }
        return group;
    }
    

    /**
     * Hilfklasse, die einen veraenderbaren long-Wert
     * kapselt.
     * 
     * @author Patrick Fries
     */
    private class MutableLong {

        /** Gekapselter long-Wert */
        private long value;
        
        
        /** Initialisiert eine neue MutableLong-Instanz */
        public MutableLong() {
        }
        
        /**
         * Liefert den Wert des gekapselten long-Werts
         * @return Gekapselter long-Wert
         */
        public long getValue() {
            return this.value;
        }
    }
}

Viele Grüße und danke nochmal für die Hilfestellung
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
dereki2000 Windows Benachrichtigung erzeugen Allgemeine Java-Themen 2
sambalmueslie Benachrichtigung bei neuer Objekt-Instanz Allgemeine Java-Themen 5
B Benachrichtigung, wenn sich Benutzer am Betriebssystem anmeldet Allgemeine Java-Themen 9
M growl benachrichtigung unter mac Allgemeine Java-Themen 4
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
B Stringmanipulationen beim Dateinamen Allgemeine Java-Themen 8
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
U Fehler beim Compillieren Allgemeine Java-Themen 13
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
J Jasper Report - seltame Meldung beim compilieren Allgemeine Java-Themen 3
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
J WARNING: An illegal reflective access operation has occurred, beim Compilieren von JasperReports, was bedeutet das ? Allgemeine Java-Themen 23
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Beim Öffnen Dialog Directory und Filetype definieren Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Konstruktor in JSP beim Kompilieren nicht gefunden Allgemeine Java-Themen 3
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
Fischkralle Beim Clean Coden an den Schnittstellen geschnitten. Allgemeine Java-Themen 10
H Beim Konstruktor "this" Allgemeine Java-Themen 4
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
Thallius Swing Merkwürdiges Verhalten beim Panel Tausch Allgemeine Java-Themen 3
Tacofan Sound beim öffnen der GUI Allgemeine Java-Themen 8
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
J JDK installieren Das Jdk funtioniert beim Editor nicht. Allgemeine Java-Themen 3
R Verdrückt beim Sicherheitshinweis Allgemeine Java-Themen 2
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
javampir Input/Output Effizienz beim binären Lesen einer Datei Allgemeine Java-Themen 6
javampir Seltsame Lücken beim Abspielen von Sound Allgemeine Java-Themen 2
RalleYTN JAnsi Warum bleiben die Hintergrundfarben beim Reseten der Konsole? Allgemeine Java-Themen 0
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
S Verständnisproblem beim Mocking Allgemeine Java-Themen 8
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
M Eclipse Fehler beim Installieren des Plugins "Jigloo" Allgemeine Java-Themen 12
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Selenium WebDriver HtmlUnitDriver Problem beim Automatisieren Allgemeine Java-Themen 1
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
L Suchvorschläge beim eingeben einzelner Buchstaben Allgemeine Java-Themen 3
B Compiler-Fehler NullPointerException beim Auslesen von .lang-Datei Allgemeine Java-Themen 3
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
reibi Classpath Classpath Variable beim Tomcat Allgemeine Java-Themen 2
H JUnit Fehler beim Compilieren - erledigt Allgemeine Java-Themen 0
J Fehler beim parsens eine Datums Allgemeine Java-Themen 3
A Java - Beim Abspeichern Redundanzen vermeiden! Allgemeine Java-Themen 6
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben