Comment nommer les threads d'un pool de threads en Java [dupliquer]

Cette question a déjà une réponse ici:

J'ai une application Java qui utilise le framework Executor et j'ai du code qui ressemble à ceci protected ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(5)

Ma compréhension est qu'en interne la JVM créerait un pool de 5 threads. Maintenant, quand je vérifie l'exécution dans un profiler, je reçois quelque chose comme thread-pool2,thread-pool3 et ainsi de suite.

Some of these thread pools are created by the server and some are created by me, j'ai besoin d'un moyen de différencier qui ont été créés par moi et qui ont été créés par le serveur.

Je pense que si je peux nommer les pools de threads, il devrait faire l'affaire, mais ne voit aucune API qui me permettrait de faire la même chose.

Merci d'avance.

32
demandé sur Ravindra babu 2011-04-21 10:41:10

4 réponses

Vous pouvez passer votre propre ThreadFactory à ScheduledThreadPoolExecutor. Votre ThreadFactory va créer thread et peut lui donner le nom que vous voulez. Votre ThreadFactory peut également réutiliser les exécuteurs .defaultThreadFactory () , et ne change que le nom avant de renvoyer le thread.

45
répondu Peter Štibraný 2011-04-21 06:51:31
public class NamedThreadPoolExecutor extends ThreadPoolExecutor {

private static final String THREAD_NAME_PATTERN = "%s-%d";

    public NamedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, final TimeUnit unit,
                               final String namePrefix) {
       super(corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<>(),
            new ThreadFactory() {

                private final AtomicInteger counter = new AtomicInteger();

                @Override
                public Thread newThread(Runnable r) {
                    final String threadName = String.format(THREAD_NAME_PATTERN, namePrefix, counter.incrementAndGet());
                    return new Thread(r, threadName);
                }
            });
    }

}
10
répondu Karol Król 2015-09-15 07:08:45

À partir du ThreadPoolExecutor documentation :

Création de nouveaux threads Les nouveaux threads sont créés à l'aide D'un ThreadFactory. Si non spécifié autrement, un exécuteurs.defaultThreadFactory() est utilisé, qui crée des threads pour tous être dans le même groupe de threads et avec la même priorité NORM_PRIORITY et le même statut non-démon. En fournissant un ThreadFactory différent, Vous pouvez modifier le nom du thread, le groupe de threads, la priorité,l'état du démon, etc. Si un ThreadFactory ne parvient pas à créer un thread lorsqu'il est demandé en retournant null À partir de newThread, l'exécuteur continuera, mais pourrait ne pas être en mesure d'exécuter des tâches.

7
répondu noamt 2011-04-21 06:47:54

Utilisez votre propre usine de fil personnalisé. Implémentez un ThreadFactoryBuilder pour créer des usines de threads personnalisées qui vous permettent d'effectuer les opérations suivantes:

  1. ont des noms de threads personnalisés
  2. avoir le choix entre threads-User ou Daemon threads
  3. ont le choix de la priorité de Thread
  4. avoir la possibilité de définir des gestionnaires d'exceptions non interceptés

Vous avez un exemple D'implémentation ThreadFactoryBuilder dans le post suivant que vous pouvez utiliser.

Http://wilddiary.com/understanding-java-threadfactory-creating-custom-thread-factories/

0
répondu Drona 2014-09-12 11:06:19