Как посмотреть, какой монитор ожидает поток? - PullRequest
3 голосов
/ 17 марта 2011


Я использую netbeans и его профилировщик для просмотра активности потоков.Графики показывают, что, когда выполняется не только рабочий поток, потоки могут оставаться в нескольких состояниях: запущен, ожидает, отслеживает.
Я написал мое java-приложение, так что его рабочие потоки должны использовать только переменные только для чтениябез необходимости синхронизации.
Однако при выполнении профилировщика netbeans я вижу, что мои потоки часто находятся в состоянии монитора.Я предполагаю, что они ждут, чтобы разблокировать монитор, но я могу представить, какой монитор.

Итак, мой вопрос: есть ли способ понять, какого монитора ожидает поток?

Спасибо

Ответы [ 2 ]

5 голосов
/ 17 марта 2011

Сначала попробуйте сделать дамп потока, когда происходит ожидание на мониторе. Существуют различные способы сделать это, включая jstack, jvisualvm и kill -3. Также Netbeans может сделать это для приложения, которое он выполнил.

Имея файл дампа потока импортируйте его в tda . Хотя вы многое узнаете, просто прочитав файл в текстовом редакторе, это простое приложение группирует потоки и мониторы, позволяет просматривать потоки, включая гиперссылки и т. Д. Выглядит довольно неясно, но хорошо работает.

Если у вас возникнут трудности с чтением трассировки стека (это очень важный навык для разработчиков Java), опубликуйте здесь одну ожидающую ветку.

0 голосов
/ 17 марта 2011

Звучит так, как будто вы написали, что ваша программа не нуждается в синхронизации, и что вам действительно нужно знать, так это то, где в коде она нуждается в скорости синхронизации, а не в каких объектах она блокируется. Чтобы найти, где в коде это находится, посмотрите на дамп потока. Jconsole / jstack может сделать это.

...