est-il possible d'écrire un auditeur de création de fil en Java? Par exemple, en utilisant AOP ?! P>
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. P>
3 Réponses :
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 !
}
}
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é).
Je pense que cela serait possible avec AOP (aspectj par exemple). Mais il est toujours nécessaire de créer votre propre fichier code> et 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 threadgroup code> /
exécutant code> 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 code> de votre thread si vous souhaitez enregistrer sur le lancement de thread ou sur le
créethread code> de votre piscine si vous souhaitez vous inscrire sur la création des objets de fil. p>
thread.start code>, 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 code> et
appelable.call code> plutôt que sur le fil
plutôt que sur le fil
plutôt que sur
. Démarrer code>, cela pourrait être suffisant. p>
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é i>, mais seraient appelés lorsque les threads sont créés i>? E.g., que se passerait-il si un thread est créé i> mais jamais a commencé i>?
@ 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 code> et définissant la pointe pour les nouvelles classes CTOR fonctionnerait.
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. P>
En théorie sa possible (mais non recommandée) à la sous-classe à notifier lorsqu'un thread est ajouté ou supprimé du groupe. P>
Il est probable que l'interrogation des threads de ces groupes ou de sonder tous les threads est une meilleure solution. P>
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)
Si vous enregistrez un
Classloader CODE> 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 code > sera consulté et vous avez l'occasion d'enregistrer le fil ....
J'irais par le chemin d'extension du fil code> 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/ ...