2011-03-17 43 views
3


我使用netbeans和它的分析器來查看線程活動。 這些圖表顯示,當有多個工作線程正在執行時,這些線程可以保持許多狀態:運行,等待,監視。
我寫了我的Java應用程序,以便其工作線程應該只使用只讀變量,而不需要同步。
但是,當執行netbeans分析器時,我可以看到我的線程經常處於監視狀態。 我想他們正在等待顯示器解鎖,但我可以想象哪個顯示器。如何查看哪個監視器是等待的線程?

所以,我的問題是: 有沒有一種方法來理解一個線程正在等待的監視器?

謝謝

回答

5

首先嚐試在監視器上等待時執行線程轉儲。有多種方式可以做到這一點,包括jstack,jvisualvmkill -3。 Netbeans也可以爲它執行的應用程序執行此操作。

讓線程轉儲文件將其導入tda。雖然您只需通過純文本編輯器閱讀該文件就可以發現很多東西,但這個簡單的應用程序將線程和監視器分組,允許您瀏覽包括超級鏈接等線程。看起來很晦澀難懂,但運行良好。

如果您在閱讀堆棧跟蹤(這是Java開發人員非常重要的技能)時遇到困難,請在此處發佈一個等待線程。

+0

++對。每個線程的堆棧應該告訴你爲什麼它在等待。 – 2011-03-18 00:21:32

0

這聽起來像你寫你的程序並不需要同步,哪些是你真的爲什麼要知道的是在它的代碼是,它需要同步ratehr比對象被鎖定的。要查找代碼中的位置,請查看線程轉儲。 Jconsole/jstack可以做到這一點。