Нить пропадает без следа - PullRequest
0 голосов
/ 20 апреля 2011

Я пытаюсь отладить проблему. У нас есть несколько потоков, которые работают с данными из BoundedLinkedQueue. После обработки одной записи текущий поток выполняет Thread.currentThread().yield().

Теперь время от времени наблюдается, что одна из нитей просто исчезает! Я проследил журналы, чтобы найти, что такой «исчезающий» поток работает до оператора yield. После этого не обнаружено никаких следов этого потока, а также нет ошибок или исключений рядом с последним журналом, увиденным для потока.

Может кто-нибудь дать какие-нибудь указатели для отладки направления? Является ли использование доходности правильным? Является ли доход достоверным утверждением? Это потому, что я обнаружил эту статью, предлагающую избежать заявления о доходности? Кто-нибудь видел такое условие раньше?

Редактировать: В некоторых исследованиях кажется, что try / catch может пропустить некоторые исключения, и они будут просто помещены в System.err, что может быть незаметно в многопоточной среде. Спасибо @JVerstry за указатель, я установил uncaughtexceptionhandler для потока. Процесс сборки и запуска занимает много времени. Буду обновлять еще раз у меня что-то конкретное. Вот несколько ссылок, которые говорят о UncaughtExceptionHandler:

Ответы [ 4 ]

1 голос
/ 20 апреля 2011

Как указано в статье, которую вы связали, yield не определяет, прерван ли текущий квант. Если вы уступите непосредственно перед выходом из потока, планировщик может просто завершить квант для потока, вызывая немедленный выход из потока.

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

Мы смогли получить дамп потока, когда это повторилось, и кажется, что поток просто блокировал вызов JDBC навсегда - ошибка в jdbc jar. Мы только что заменили банку последней версией и, похоже, решили ее. Спасибо всем за ценный вклад - заставил меня узнать много нового. Кроме того, теперь установите тайм-аут запроса, чтобы навсегда заблокировать блокировку.

0 голосов
/ 21 апреля 2011
  1. Что происходит после выхода урожая? Будет ли завершен поток или он попытается обработать другой фрагмент данных из очереди?
  2. Вы должны убедиться, что то, что вызывается после yield, на самом деле вызывается с помощью logging.
  3. Как вы узнали, что тема вышла? Вы проверяли, используя просмотр трассировки стека (используйте Jstack)?
  4. Наконец, почему вы вообще используете yield? Я предполагаю, что ваш BoundedLinkedQueue позволяет потокам извлекать данные потокобезопасным способом или блокирует, если очередь пуста. Почему бы просто не позволить JVM управлять планированием потоков?
0 голосов
/ 20 апреля 2011

Урожай не заставляет потоки исчезать.Возможно, что ваш поток генерирует исключение, и это не перехватывается.Вы реализовали необработанный обработчик исключений ?Если нет, то я рекомендую вам сделать это.Это объяснило бы вашу проблему (если поток не заканчивается естественным образом и ваш код не выполняет то, что, как вы думаете, должен делать)

...