通过调用 Thread.getAllStackTraces() 可以很容易地从 Java 程序中输出线程转储。我有时在 JSP 中使用它来轻松诊断问题。但通常您需要了解的另一个重要信息是线程持有哪些锁以及阻塞的线程试图获取哪些锁。有没有办法通过 Java API 获取这些信息?我发现的唯一东西是 Thread.holdsLock,但这只有在您知道所有可能被锁定的对象时才有帮助,并且不会告诉您阻塞的线程试图获取哪些锁。
(当然,您可以通过使用工具创建线程转储来获取此信息,但如果系统不在您自己的机器上,则此选项通常不易获得。)