我正在使用netbeans和它的分析器来查看线程活动。
图表显示,当执行的线程不止一个时,线程可以保持多种状态:运行,等待,监视。
我编写了我的java应用程序,以便其工作线程只使用只读变量,而不需要同步
但是,在执行netbeans探查器时,我可以看到我的线程经常处于监视器状态。
我想他们正在等待显示器解锁,但我可以想象哪个显示器。
所以,我的问题是: 有没有办法了解线程正在等待什么监视器?
谢谢
答案 0 :(得分:5)
首先尝试在监视器上等待时进行线程转储。有多种方法可以做到这一点,包括jstack
,jvisualvm和kill -3
。 Netbeans也可以为它执行的应用程序执行此操作。
让线程转储文件将其导入tda。虽然你通过在纯文本编辑器中读取文件发现了很多,但这个简单的应用程序将线程和监视器分组,允许你浏览线程,包括超链接等。看起来很模糊,但效果很好。
如果您在阅读堆栈跟踪时遇到困难(对于Java开发人员来说这是一项非常重要的技能),请在此处发布一个等待线程。
答案 1 :(得分:0)
听起来你编写的程序不需要同步,而你真正知道的是代码中的哪个位置需要同步速率而不是它锁定的对象。要查找代码中的位置,请查看线程转储。 Jconsole / jstack可以做到这一点。