В Java можно узнать, какой текущий метод / методы выполнялись? - PullRequest
2 голосов
/ 28 мая 2011

Я работаю с потоками, но через некоторое время большинство из них перестают выполнять свою работу.Первым делом я подумал, что это тупик, но все с состоянием RUNNING.

Я полагаю, в моей логике есть ошибка или новая характеристика, которую я не осознал, и которую я должен обработать (это веб-сканер).

Возможно ли получить текущий исполняемый метод или операцию?Я хочу, чтобы это увидело, где мои потоки оказались в ловушке.

РЕДАКТИРОВАТЬ: я думаю, что это то, что мне нужно обработать, или в моей логике есть ошибка, потому что это происходит после некоторого времени выполнения, а не сразу после запуска.

Ответы [ 7 ]

2 голосов
/ 28 мая 2011

Сделать виртуальную машину для сброса потоков (Ctrl-Break). Найдите свои темы в списке. Посмотрите на самый верхний метод трассировки стека. Готово.

2 голосов
/ 28 мая 2011

Отладчик - это путь.Это то, для чего они предназначены.

Отладчики Java с поддержкой многопоточности встроены в Eclipse и Netbeans IDE.

2 голосов
/ 28 мая 2011

Вы можете получить текущую трассировку стека в Java.Вы получите массив из StackTraceElement элементов.

Первый элемент в массиве - это текущий выполняемый метод.

См. Следующий вопрос о том, как получить трассировку стека:

Получить текущую трассировку стека в Java

Код может выглядеть следующим образом:

StackTraceElement[] trace = Thread.currentThread().getStackTrace();
StackTraceElement yourMethod = trace[1];
System.out.println(yourMethod.getMethodName());
1 голос
/ 28 мая 2011

Дампы потока являются правильным решением проблемы. Если вы хотите сделать это программно в рамках процесса (какая-то логика мониторинга), то java.lang.management.ThreadMXBean предоставляет доступ ко всем потокам вместе с их текущими стеками на данный момент.

1 голос
/ 28 мая 2011

У вас есть 2 варианта:

  1. Используйте отладку, чтобы получить некоторое понимание того, что было выполнено, а что нет.

  2. Использовать много сообщений журнала(вы также можете создавать стековые трассировки в этих сообщениях)

0 голосов
/ 28 мая 2011

Считаете ли вы, что ваша программа-поисковый робот находится в цикле, обрабатывающем те же URL-адреса.Добавьте несколько журналов высокого уровня, чтобы каждый поток записывал, что он обрабатывает.

0 голосов
/ 28 мая 2011

Это, бросить исключение, немедленно поймать его и сохранить стек. Это почти так же эффективно, как просить слона лететь за границу, но это возможно, поскольку он извлекает текущий стек вызовов в то, с чем вы можете работать.

Тем не менее, вы уверены, что не столкнулись с livelock?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...