Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Найти поток с заданным именем


Автор: Mirkes 6.1.2012, 11:42
Сразу оговорюсь, что все предложенное к прочтению - прочитал.
В теме "маленький тест" нашел способ перебора всех потоков. Однако хочется
найти единственный нужный короче.
Имя потока мне известно. Как найти поток.
Точнее задача такая
На экран вывешивается модальный диалог без кнопки завершения, отображающий результаты работы некоего потока, запущенного не из диалога.
Результаты работы (промежуточные) диалог подбирает из некоторых переменных класса, переданного диалогу как параметр.
Признак нормального завершения работы - тоже.
А вот если поток разваливается, то все виснет насмерть.
Хочется при возникновении подозрения о смерти потока проверить жив ли он. 
Если я правильно понимаю, можно проверить все потоки, и если потока с нужным именем нет, то помер.
Но это наверное долго. Хочется как-нибудь побыстрее это проверить.
Не подскажете как это сделать или где искать решение?

Автор: dorogoyIV 6.1.2012, 12:36
ну можно пойти от обратного - создать коллекцию потоков:
java.util.Vector <Thread> ...
перед смертью поток сообщает о своей кончине вектору, ну и т.д. ...

Автор: Mirkes 6.1.2012, 15:24
Как сообщает? Речь одет о стандартной процедуре или о настройке в потоке? Уточните пожалуйста.

Автор: COVD 6.1.2012, 18:32
Цитата

А вот если поток разваливается, то все виснет насмерть.

Поток не "разваливается". Он блокируется и возможно блокирует другие потоки. Это deadlock. Быстро ли, медленно ли (у вас что, миллион потоков?) вы его найдете - вам это скорее всего не поможет. Вы обнаружите, что поток жив ( isAlive()=true). А надо искать место блокировки и причину.
Если вам нужна запись в лог о завершении потока, то удобно в методe run  использовать конструкцию try{ .. } finally { сообщение в лог }.

Автор: Mirkes 6.1.2012, 19:29
Цитата(COVD @  6.1.2012,  18:32 Найти цитируемый пост)
Поток не "разваливается". Он блокируется и возможно блокирует другие потоки.

В моем случае речь шла о возникновении в потоке ошибки, приводящей к развалу или завершению.
Провел эксперимент.
Специально ввел в код фрагмент, приводящий к ошибке. Получил следующее сообщение в консоли
Код

Exception in thread "Learn" java.lang.NullPointerException
    at pcam.GalaPT.learnDo(GalaPT.java:711)
    at pca1.ExecMenuPane$3.run(ExecMenuPane.java:744)
    at java.lang.Thread.run(Thread.java:662)


При этом диалог вывел false на запрос isALive()

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

Автор: COVD 6.1.2012, 20:29
если в run() выброшено исключение, и оно не перехвачено, то поток умирает: isALive()=false, выполнение метода run завершено. Это ваш пример илюстрирует.

Автор: Mirkes 6.1.2012, 20:57
Спасибо. Меня такое положение дел устраивает.

Автор: dobrolub 6.1.2012, 21:09
для поиска deadlocked Threads посмотри на стандартный java.lang.management.ThreadMXBean

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)