Disons qu'un thread s'exécute dans une fonction synchronisée en Java et qu'un autre thread veut accéder à la même méthode mais il devra attendre que le premier thread soit terminé . Comment le deuxième thread peut-il savoir quel thread a le verrou sur l'objet. Je voudrais imprimer les détails du premier Thread et éventuellement d'où le premier Thread a été initié.Comment obtenir des détails sur Thread qui possède un verrou sur l'objet
Répondre
Si vous utilisez java.util.concurrent.locks.ReentrantLock
alors une sous-classe peut appeler getOwner
.
Vous pouvez également utiliser JMX. Itérer à travers les threads pour trouver le java.lang.management.ThreadInfo
avec getLockedMonitors()
ou getLockedSynchronizers()
approprié.
Je crois que ce n'est pas possible de le faire. Cependant, vous pouvez faire quelque chose de similaire avec un certain codage supplémentaire:
public void myFunction() {
System.out.println("" + Thread.currentThread() + " entering sync @ myFunction");
synchronized(this) {
System.out.println("" + Thread.currentThread() + " entered sync @ myFunction");
...
System.out.println("" + Thread.currentThread() + " leaving sync @ myFunction");
}
System.out.println("" + Thread.currentThread() + " left sync @ myFunction");
}
Il est un peu délicat, presque ce que Tom Hawtin a écrit, mais vous devez demander l'info explicity du moniteur lors de l'obtention du ThreadInfo dans dumpAllThreads. Quelque chose comme:
Object lock = ...
ThreadMXBean mx = ManagementFactory.getThreadMXBean();
ThreadInfo[] allInfo = mx.dumpAllThreads(true, false);
for (ThreadInfo threadInfo : allInfo) {
MonitorInfo[] monitors = threadInfo.getLockedMonitors();
for (MonitorInfo monitorInfo : monitors) {
if (monitorInfo.getIdentityHashCode() == System.identityHashCode(lock)) {
StackTraceElement[] stackTrace = threadInfo.getStackTrace();
// use the the Information from threadInfo
}
}
}
Est-ce à des fins de diagnostic, ou est-il pour la fonctionnalité que vous souhaitez utiliser dans le cadre de votre application. Si c'est pour le diagnostic, alors les différentes solutions de journalisation verbeuse dans les autres réponses ici sont probablement suffisantes pour vous lancer. Si vous voulez faire cela dans le cadre de la fonctionnalité, alors vous devriez vraiment utiliser quelque chose de plus robuste et flexible que le mot-clé synchronized
, tel que le magicien ReentrantLock
mentionné par @Tom.
- 1. Détermination du processus qui a un verrou sur un fichier
- 2. COM: comment obtenir plus de détails sur les erreurs COM?
- 3. Comment obtenir l'utilisation du processeur par thread sur Windows (win32)
- 4. Obtenir des informations sur Wikipedia - comment obtenir un formulaire HTML?
- 5. Déterminer par programme quel thread Java contient un verrou
- 6. Comment obtenir l'utilisation du processeur par thread sur Mac OSX
- 7. Chargement du verrou sur Internet Explorer
- 8. J'ai besoin d'aide pour obtenir des informations sur un thread d'interface utilisateur et un autre thread dans C#
- 9. Ai-je besoin d'un verrou sur une liste? C#
- 10. Les threads attendent-ils sur un verrou FIFO?
- 11. en utilisant pyunit sur un thread réseau
- 12. Comment obtenir des commentaires sur une page à partir d'un thread en cours d'exécution dans ASP.NET?
- 13. C# obtenir des détails de sous-classes
- 14. Différence entre verrou (verrou) et verrouillage (variable_qui_utilise_I_am_using)
- 15. C# Thread in Thread: comment obtenir SynchronizationContext.Current?
- 16. NSURLDécharger des méthodes de délégué sur un thread séparé
- 17. Comment puis-je exécuter certaines commandes sur un thread séparé?
- 18. Comment obtenir des informations sur photo sur flickr?
- 19. PowerShell: comment obtenir des informations détaillées sur un événement WMI?
- 20. Flex uploader et détails sur flex
- 21. comment obtenir tous les détails sur une table mysql en utilisant C#?
- 22. Comment obtenir des informations en cliquant sur un lien?
- 23. sql server 2000: libération du verrou sur la table?
- 24. Comment obtenir des informations sur la classe et l'exécution?
- 25. Comment créer un paquet "deux passes" dans SSIS pour obtenir des détails supplémentaires?
- 26. Comment obtenir un identifiant client unique sur le serveur?
- 27. condition de course dans le verrou commun sur le fichier?
- 28. invoquer thread-safe sur NET CF
- 29. Exception de thread sur SelectedNode = .Nodes [0]
- 30. Passage d'un jeton d'emprunt d'identité sur un thread géré à un thread non géré