7
votes

Auditeur de création de fil

est-il possible d'écrire un auditeur de création de fil en Java? Par exemple, en utilisant AOP ?!

Je veux dire quelque chose comme ça que si mon application crée un fil, j'aimerais enregistrer cet objet dans ma propre table, conteneur ou quelque chose.


6 commentaires

Si vous enregistrez un Classloader dans le fil principal, vous espérez-vous être hérité de tous les nouveaux threads, et espérons-le à nouveau que tout fil devra charger une classe, ce qui signifie votre classier sera consulté et vous avez l'occasion d'enregistrer le fil ....


J'irais par le chemin d'extension du fil avec les méthodes requises pour les auditeurs. Bien sûr, ne fonctionnera que pour votre code.


Avez-vous besoin de suivre la transition (comme: "Désormais, un nouveau thread a été créé et je dois y réagir à la fois") ou est-ce suffisant d'avoir une liste ou quelque chose de threads créé dans / par votre application à titre spécifique Points dans le temps (comme: "Maintenant, je veux connaître les discussions et faire quelque chose avec eux.")?


Je voudrais écrire mon propre moniteur de fil, alors j'ai besoin d'objets de fil "actuels". Je vais créer mon propre fil décoré pour gérer toute ces choses de surveillance - mais le problème est de savoir comment obtenir les informations que le nouveau thread va créer sans rien déterrer - "instantanément". Je voudrais écrire un moniteur facile à exécuter dans n'importe quelle application.


Vérifiez les gars qui a écrit le débogueur Eclipse. Peut-être qu'ils peuvent donner un indice pour cette question;)


Connexes: Stackoverflow.com/questions/9874641/ ...


3 Réponses :


4
votes

Je créerais un fil qui répertorie continuellement tous les threads d'exécution de la JVM.
Ensuite, chaque fois qu'il est noticieux qu'un nouveau thread est apparu, il en informerait de la manière une classe dans votre code.

Voici quelques liaisons sur la façon de répertorier tous les threads en cours d'exécution sur la JVM: P>

Obtenez une liste de tous les discussions Actuellement en cours d'exécution en Java P> Li>

  • Listing Tous les threads d'exécution P> li> ol>

    ============ P>

    Code de départ: P>

    threadcreationlistener.java strong> p >

    public class Main {
        public static void main(String[] args) {
           ThreadCreationMonitor tcm = new ThreadCreationMonitor();
           tcm.start();
    
           MyThreadInfoConsumer myTIC = new MyThreadInfoConsumer();
           tcm.addListener(myTIC);
    
           // rest of your code...
           // Don't forget to call tcm.shutdown() when exiting your application !
        }
    }
    


  • 2 commentaires

    Ces exemples sont bons et utiles, mais il n'y a pas de comportement auditeur. J'aimerais avoir l'information que le nouveau thread va créer par JVM, disons «instatitly» sans rien déterrer.


    @ Łukaszrzeszotarski Vous pouvez implémenter un comportement d'auditeur à partir des exemples ci-dessus, ils sont sur les threads non créés (comme vous l'avez demandé).



    2
    votes

    Je pense que cela serait possible avec AOP (aspectj par exemple). Mais il est toujours nécessaire de créer votre propre fichier et threadgroup / exécutant Types, sauf si vous ne pouvez recompiler les classes JDK avec le compilateur de l'aspect. Définissez la méthode de point de pointe sur la méthode de votre thread si vous souhaitez enregistrer sur le lancement de thread ou sur le créethread de votre piscine si vous souhaitez vous inscrire sur la création des objets de fil.


    Ce qui suit fonctionne uniquement si vous avez recompansé le JDK avec le compilateur de l'aspect: Tous les filets sont démarrés avec thread.start , alors écrivez un point de pointe pour cette méthode, vous pouvez utiliser des conseils pour faire ce que vous voudriez. Bien sûr, cela n'est pas parfait depuis par ex. Un exécuteur CachedthreadPool peut ne pas démarrer un nouveau thread pour chaque tâche, mais peut-être que si vous enregistrez une pointe de pointe sur runnable.run et appelable.call plutôt que sur le fil plutôt que sur le fil plutôt que sur . Démarrer , cela pourrait être suffisant.


    6 commentaires

    Cela pourrait fonctionner pour faire fonctionner des threads, mais la question concerne l'écoute des threads créée et non des threads en cours d'exécution.


    @ user454322 N ° A avant que des conseils seront appelés lorsque les threads sont démarrés. (c'est-à-dire l'une de ces 3 méthodes sont appelées)


    Je comprends que cela s'appellera avant que les threads ont commencé , mais seraient appelés lorsque les threads sont créés ? E.g., que se passerait-il si un thread est créé mais jamais a commencé ?


    @ user454322. Je vois, j'ai interprété la question comme s'il voulait s'inscrire sur l'événement "Démarrer". J'ai édité ma réponse.


    @zeller sonne bien. Et qu'en est-il de l'enregistrement de points de pointe sur un constructeur de classe de thread? Cela fonctionnerait-il - quelque chose comme ça? Qu'en penses-tu?


    Cela pourrait être correct, mais seulement si vous voulez écouter la création de fil, pas la création de tâches. Gardez également à l'esprit que si vous souhaitez utiliser les classes JDK, vous devez les compiler avec aspect. Mais sous-classement thread et définissant la pointe pour les nouvelles classes CTOR fonctionnerait.



    1
    votes

    Peut-être qu'un groupe de threads est ce dont vous avez besoin. Tous les threads sont membres d'un groupe de threads et lorsque vous démarrez un nouveau thread, il est ajouté au même groupe que son parent par défaut.

    En théorie sa possible (mais non recommandée) à la sous-classe à notifier lorsqu'un thread est ajouté ou supprimé du groupe.

    Il est probable que l'interrogation des threads de ces groupes ou de sonder tous les threads est une meilleure solution.


    2 commentaires

    Un thread est ajouté au groupe de fil sur la création ou lors de son démarrage?


    Du code, il suggère quand il est démarré. Si vous souhaitez savoir quand un thread est créé, vous devez le fil de la sous-classe (et modifier tout le fichier de création de fil)