2010-12-06 2 views
3

В целях отладки я хочу выяснить, какие потоки моей программы все еще запущены. Кажется, что один или несколько потоков, которые случайно не были прерваны. Какой-то хороший печатный формат будет бонусом.Темы Java: Посмотрите, какие потоки все еще запущены

+0

Thread.isAlive()? – yurib 2010-12-06 23:21:53

ответ

3

jVisualVM является вашим другом для этого вида отладки. Он находится в каталоге/bin вашего JDK-установки. Показывает все потоки как графическое представление и позволяет вам развернуть то, что они делают. Кнопка Thread Dump распечатает все свои текущие трассировки стека, чтобы вы могли увидеть, что-то застряло где-то в вашем пользовательском коде.

+1

+1 JVisualVM - отличный инструмент. Я предпочитаю JConsole для изучения отдельных потоков, но функция Dump Dump JVisualVM отличная. Я бы хотел, чтобы он сбрасывал его на дисплей, который позволял искать/выделять текст. – 2010-12-06 23:30:16

+0

Я использую fgrep для поиска текста. Например, jstack | fgrep "com.bla.foo" – 2010-12-06 23:41:38

+0

@Tim: Да. Я просто копирую/вставляю дамп в свой текстовый редактор. – 2010-12-06 23:52:25

5

Используйте инструмент командной строки «jps», чтобы увидеть активные java-процессы и jstack для отображения активных потоков.

jstack doc

example

3

Если вы ищете программное решение, что-то вроде этого (в JDK 1.5 или более поздняя версии) должно работать:

Map<Thread, StackTraceElement[]> stack = Thread.getAllStackTraces(); 
for (Map.Entry<Thread, StackTraceElement[]> entry : stack.entrySet()) { 
    System.out.println("Thread named '" + 
         entry.getKey().getName() + 
         "' is alive"); 
} 
0

«Кажется, что один или несколько потоков, которые случайно не прерывались». Я не сказал, что вещи не прерывались. Вызов Thread.interrupt() не приводит к остановке runnable. Он устанавливает флаг прерывания и, возможно, вызывает блокирующие операции (например, вызовы Thread.sleep или java.nio), чтобы вызывать исключение InterruptedException или какое-либо другое исключение (например, ClosedByInterruptException для nio). Ваши runnables должны проверить Thread.currentThread(). IsInterrupted() и вести себя красиво.

Смежные вопросы