Disons que j'ai une application qui utilise le Executor
cadre en tant que tel
Executors.newSingleThreadExecutor().submit(new Runnable(){
@Override
public void run(){
// do stuff
}
}
Quand je lance cette application dans le débogueur, un thread est créé avec le nom suivant (par défaut): Thread[pool-1-thread-1]
. Comme vous pouvez le voir, ce n'est pas très utile et pour autant que je sache, le Executor
cadre ne fournit pas un moyen facile de nommer les threads ou les pools de threads créés.
Alors, comment peut-on fournir des noms pour les threads / thread-pools? Par exemple, Thread[FooPool-FooThread]
.
Vous pouvez essayer de fournir votre propre fabrique de threads, qui créera un thread avec les noms appropriés. Voici un exemple:
la source
Vous pouvez également modifier le nom de votre thread par la suite, pendant l'exécution du thread:
Cela pourrait être intéressant si, par exemple, vous utilisez la même ThreadFactory pour différents types de tâches.
la source
(Note however that if this single thread terminates due to a failure during execution prior to shutdown, a new one will take its place if needed to execute subsequent tasks.)
. Si ExecutorService remplace le thread, il sera nommé par ThreadFactory. Là encore, voir le nom disparaître pendant le débogage pourrait être un indicateur utile.le
BasicThreadFactory
apache commons-lang est également utile pour fournir le comportement de dénomination. Au lieu d'écrire une classe interne anonyme, vous pouvez utiliser le générateur pour nommer les threads comme vous le souhaitez. Voici l'exemple des javadocs:la source
Si vous utilisez Spring,
CustomizableThreadFactory
vous pouvez définir un préfixe de nom de thread.Exemple:
Alternativement, vous pouvez créer votre en
ExecutorService
tant que bean Spring en utilisantThreadPoolExecutorFactoryBean
- alors les threads seront tous nommés avec lebeanName-
préfixe.Dans l'exemple ci-dessus, les threads seront nommés avec
myExecutor-
préfixe. Vous pouvez définir le préfixe explicitement sur une valeur différente (par exemple."myPool-"
) En définissantexecutorFactoryBean.setThreadNamePrefix("myPool-")
le bean d'usine.la source
Il existe un RFE ouvert pour cela avec Oracle. D'après les commentaires de l'employé Oracle, il semble qu'ils ne comprennent pas le problème et ne le résoudront pas. C'est une de ces choses qui est très simple à prendre en charge dans le JDK (sans briser la compatibilité descendante), donc c'est une sorte de honte que le RFE soit mal compris.
Comme indiqué, vous devez implémenter votre propre ThreadFactory . Si vous ne voulez pas utiliser Guava ou Apache Commons uniquement à cette fin, je fournis ici une
ThreadFactory
implémentation que vous pouvez utiliser. Il est exactement similaire à ce que vous obtenez du JDK, à l'exception de la possibilité de définir le préfixe du nom du thread sur autre chose que "pool".Lorsque vous souhaitez l'utiliser, vous profitez simplement du fait que toutes les
Executors
méthodes vous permettent de fournir la vôtreThreadFactory
.Ce
donnera un ExecutorService où les threads sont nommés
pool-N-thread-M
mais en utilisantvous obtiendrez un ExecutorService où les threads sont nommés
primecalc-N-thread-M
. Voila!la source
ThreadGroup
en faveur deThreadPoolExecutor
.Passez la ThreadFactory à un service d'exécution et vous êtes prêt à partir
la source
Un moyen rapide et sale est d'utiliser
Thread.currentThread().setName(myName);
dans larun()
méthode.la source
Étendre ThreadFactory
public interface ThreadFactory
Thread newThread(Runnable r)
Exemple de code:
production:
....etc
la source
Comme d'autres réponses l'ont déjà dit, vous pouvez créer et utiliser votre propre implémentation de l'
java.util.concurrent.ThreadFactory
interface (aucune bibliothèque externe requise). Je colle mon code ci-dessous car il est différent des réponses précédentes car il utilise laString.format
méthode et prend un nom de base pour les threads comme argument constructeur:Et ceci est un exemple d'utilisation:
EDIT : rendre mon
ThreadFactory
implémentation thread-safe, merci à @mchernyakov de l' avoir signalé.Même si nulle part dans la
ThreadFactory
documentation il n'est dit que ses implémentations doivent être thread-safe, le fait que leDefaultThreadFactory
thread-safe soit un indice important:la source
La solution Java de base que j'utilise pour décorer les usines existantes:
En action:
la source
la source
Vous pouvez écrire votre propre implémentation de ThreadFactory, en utilisant par exemple une implémentation existante (comme defaultThreadFactory) et changer le nom à la fin.
Exemple d'implémentation de ThreadFactory:
Et l'utilisation:
la source
J'utilise pour faire la même chose comme ci-dessous (nécessite une
guava
bibliothèque):la source
ThreadFactoryBuilder
provient de la bibliothèque Google Guava.Je trouve plus facile d'utiliser un lambda comme fabrique de threads si vous voulez simplement changer le nom d'un exécuteur de thread unique.
la source
main@1, Finalizer@667, Reference Handler@668, Your name@665, Signal Dispatcher@666
Ceci est mon usine personnalisée fournissant des noms personnalisés pour les analyseurs de vidage de thread. Habituellement, je donne juste
tf=null
pour réutiliser la fabrique de threads par défaut JVM. Ce site Web a une usine de threads plus avancée.Pour votre commodité, il s'agit d'une boucle de vidage de thread à des fins de débogage.
la source