Benennen von Threads und Thread-Pools von ExecutorService
Sagen wir, ich habe eine Anwendung, die verwendet die Executor
framework als solche
Executors.newSingleThreadExecutor().submit(new Runnable(){
@Override
public void run(){
//do stuff
}
}
Wenn ich diese Anwendung im debugger, ein thread erstellt wird mit der folgenden (default -) name: Thread[pool-1-thread-1]
. Wie Sie sehen können, ist dies nicht sonderlich hilfreich und soweit ich das beurteilen kann, der Executor
Rahmen nicht bieten eine einfache Möglichkeit, um den Namen des erstellten threads oder thread-pools.
So, wie geht man über die Bereitstellung von Namen für die threads/thread-pools? Zum Beispiel Thread[FooPool-FooThread]
.
InformationsquelleAutor der Frage mre | 2011-05-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie liefern eine
ThreadFactory
zunewSingleThreadScheduledExecutor(ThreadFactory threadFactory)
. Die Fabrik wird responsibe für das erstellen von threads und wird in der Lage sein, Sie zu benennen.Zitieren die Javadoc:
InformationsquelleAutor der Antwort NPE
Guave fast immer hat das, was Sie müssen.
, und übergeben Sie es aus, um Ihre
ExecutorService
.InformationsquelleAutor der Antwort pathikrit
Können Sie versuchen, Ihren eigenen thread Fabrik, der thread mit den entsprechenden Namen. Hier ein Beispiel:
InformationsquelleAutor der Antwort Nikita Beloglazov
Können Sie auch ändern Sie den Namen von deinem thread danach, während der thread ausgeführt wird:
Könnte von Interesse sein, wenn zum Beispiel bist du mit dem gleichen ThreadFactory für verschiedene Arten von Aufgaben.
InformationsquelleAutor der Antwort FlorianT
Den
BasicThreadFactory
von apache-commons-lang ist auch nützlich, um die Namensgebung Verhalten. Statt zu schreiben, eine anonyme innere Klasse, können Sie den generator, um den Namen des threads, wie Sie wollen. Hier ist das Beispiel aus den javadocs:InformationsquelleAutor der Antwort scompt.com
Gibt es eine öffnen RFE für diese mit Oracle. Aus den Bemerkungen, die aus der Oracle-Mitarbeiter, es scheint Sie don ' T verstehen das Problem und nicht zu beheben. Es ist eines dieser Dinge, die ist tot einfach, um Unterstützung für das JDK (ohne brechen der Rückwärtskompatibilität), so ist es irgendwie schade, dass die RFE bekommt missverstanden.
Als Spitzen aus, die Sie benötigen, um Ihre eigenen ThreadFactory. Wenn Sie nicht wollen, ziehen Sie in Guava oder Apache Commons, nur für diesen Zweck, die ich bieten hier eine
ThreadFactory
Implementierung, die Sie verwenden können. Es ist genau das, ähnlich wie das, was Ihr aus dem JDK, mit Ausnahme Sie die Möglichkeit, die thread-Namen-Präfix etwas anderes als "pool".Wenn Sie wollen, es zu benutzen Sie einfach die Tatsache zunutze, dass alle
Executors
Methoden können Sie Ihre eigenenThreadFactory
.Diese
gibt einen ExecutorService, wo threads benannt sind
pool-N-thread-M
aber miterhalten Sie einen ExecutorService, wo threads benannt sind
primecalc-N-thread-M
. Voila!InformationsquelleAutor der Antwort peterh
Wenn Sie mit Frühling, es ist
CustomizableThreadFactory
für die Sie können eine thread-Präfix.Beispiel:
InformationsquelleAutor der Antwort Adam Michalik
Pass die ThreadFactory an einen executorservice und Sie sind gut zu gehen
InformationsquelleAutor der Antwort I.Tyger
Eine schnelle und schmutzige Art und Weise ist die Verwendung
Thread.currentThread().setName(myName);
imrun()
Methode.InformationsquelleAutor der Antwort Kirk
Erweitern ThreadFactory
public interface ThreadFactory
Thread newThread(Runnable r)
Beispielcode:
Ausgabe:
....etc
InformationsquelleAutor der Antwort Ravindra babu
Dies ist meine benutzerdefinierte factory bietet eine angepasste Namen für thread-dump-Analyse. In der Regel ich gebe einfach
tf=null
wiederverwenden JVM-Standard-Gewinde-Fabrik. Diese website verfügt über mehr fortschrittliche thread Fabrik.Für Ihre Bequemlichkeit, dies ist eine thread-dump-Schleife für debug-Zwecke.
InformationsquelleAutor der Antwort Whome
InformationsquelleAutor der Antwort many mny
Schreiben Sie Ihre eigene Implementierung von ThreadFactory, zum Beispiel einige bestehende Anwendung (wie defaultThreadFactory) und ändern Sie den Namen am Ende.
Beispiel der Implementierung ThreadFactory:
Und Verwendung:
InformationsquelleAutor der Antwort K. Gol