web-dev-qa-db-fra.com

Comment nommer les threads d'un pool de threads dans Java

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

D'après ce que je comprends, en interne, la JVM créerait un pool de 5 threads. Maintenant, quand je vérifie l'exécution dans un profileur, j'obtiens quelque chose comme thread-pool2,thread-pool3 etc.

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 ceux qui ont été créés par moi et ceux qui ont été créés par le serveur.

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

Merci d'avance.

34
Sudarshan

Vous pouvez passer votre propre ThreadFactory à ScheduledThreadPoolExecutor . Votre ThreadFactory créera du fil et pourra lui donner le nom que vous voulez. Votre ThreadFactory peut également réutiliser Executors.defaultThreadFactory () , et modifier uniquement le nom avant de renvoyer le thread.

47
Peter Štibraný
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
Karol Król

Depuis ThreadPoolExecutor documentation :

Création de nouveaux threads Les nouveaux threads sont créés à l'aide d'une ThreadFactory. Sauf indication contraire, un Executors.defaultThreadFactory () est utilisé, qui crée des threads pour qu'ils soient tous dans le même ThreadGroup et avec la même priorité NORM_PRIORITY et le statut de non-démon. En fournissant une autre ThreadFactory, , vous pouvez modifier le nom du thread , le groupe de threads, la priorité, l'état du démon, etc. Si une ThreadFactory ne parvient pas à créer un thread lorsque demandé en retournant null de newThread, l'exécuteur continuera, mais pourrait ne pas être en mesure d'exécuter des tâches.

8
noamt

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

  1. Avoir des noms de fils personnalisés
  2. Avoir le choix de threads - threads utilisateur ou démon
  3. Avoir le choix de la priorité des threads
  4. Possibilité de définir des gestionnaires d'exceptions non capturés

Vous avez un exemple d'implémentation ThreadFactoryBuilder dans l'article suivant que vous pouvez utiliser.

http://wilddiary.com/understanding-Java-threadfactory-creating-custom-thread-factories/

0
Drona