Avec ThreadPoolExecutor, comment obtenir le nom du thread en cours d'exécution dans le pool de threads?

Je suis en utilisant un ThreadPoolExecutor en Java pour la gestion d'un lot de threads en cours d'exécution. J'ai créé mon propre simple ThreadFactory afin que je puisse donner le filetage des meilleurs noms.

Le problème est que le nom est indiqué dans le Fil lorsque le pool de threads est d'abord créé et n'est pas liée à la tâche que le pool de threads est effectivement en cours d'exécution. Je comprends cela... mon Runnables et Callables--s'ils ont des noms, sont en fait un niveau d'abstraction vers le bas à partir de la ThreadPoolExecutor'threads en cours d'exécution.

Il y a eu quelques autres questions sur StackOverflow sur la création de noms pour ThreadPoolExecutor des pools de threads. (Voir Comment donner un nom à un objet appelable Fil? et Comment nommer le fils d'un pool de threads en Java.)

Ce que je veux savoir, c'est: quelqu'un aurait-il une bonne solution pour garder le nom du thread du pool en synchronisation avec l'Exécutable qu'il est effectivement en cours d'exécution?

c'est à dire Si je l'appelle Thread.getCurrentThread().getName() j'aimerais qu'il pas pour renvoyer le nom de haut-niveau du pool de threads, mais plutôt le nom de la Callable/Praticable que le thread est actuellement en cours d'exécution.

Puisque c'est principalement pour le débogage et l'exploitation forestière, j'essaie d'éviter une solution qui consiste à moi de mettre un nouveau code dans tous les Exécutables qui peuvent être soumis à la ThreadPoolExecutor--je préfère juste mettre un peu de code dans le ThreadFactory ou enveloppez la ThreadPoolExecutor lui-même, de sorte que le changement est fait en un seul endroit. Si une telle solution n'existe pas, je n'aurai probablement pas la peine puisqu'il n'est pas essentiel à la mission.

commencer à modifier Pour clarifier, je sais que je peux mettre un Thread.currentThread().setName( "my runnable name" ); comme la première ligne de chaque Exécutable de l'exécution de la méthode, mais je vais essayer d'éviter de le faire. Je suis un perfectionniste ici, et je m'en rends compte, donc je ne serai pas offensé si les gens veulent faire des commentaires sur cette question et de me le dire. fin modifier

Mon autre question, je suppose, est de savoir si les gens pensent que c'est une mauvaise idée de faire une telle chose. Devrais-je me méfier de mise à jour du pool de threads nom comme ça?

Merci pour toutes les suggestions!

"tout en gardant le nom du thread du pool en synchronisation avec l'Exécutable qu'il est effectivement en cours d'exécution" --> Praticable / Appelable ne donne pas de nom, donc je ne peux pas tout à fait voir l'essentiel de votre question. Est-ce que votre ThreadFactory fait de donner à chaque thread d'un nom distinct?
À droite, à chacune de mes Runnables et Callables de mettre en œuvre une interface, j'ai donc accès à des noms. Je me rends compte que je suis pointilleux et que j'ai déjà mis en place une fonction spéciale pour tous mes Runnables mais vous voulez éviter d'ajouter du code supplémentaire qui définit manuellement le nom du thread.
Édité pour plus de clarté, le changement de certains "pool de threads" de "thread" et certains "fils de" à "tâche".

OriginalL'auteur Jeff Goldberg | 2011-12-15