2015-04-16 3 views
3

У меня есть программа, которая работает около 50 threads. Я использую шаблон дизайна потребителя для передачи данных между потоками. После того, как программа работает некоторое время, иногда она зависает из-за того, что я использую BlockingQueue для распространения данных между потоками, и поэтому основная часть дистрибутива программы блокируется при попытке добавить данные в этот BlockingQueue. Другими словами, один из потоков останавливается по какой-то причине, а затем блокирующийQueue, который он использует для приема данных, становится полным.Многопоточная отладка в java

Как я могу отлаживать это эффективным образом? Я попытался окружить контент во всех методах run() с помощью catch(Exception e), но ничто никогда не бросается. Я развиваюсь в Java/IntelliJ.

Любые мысли, идеи или общие рекомендации?

+0

Не могли бы вы выслать какой-нибудь код? – Sildoreth

+0

Упростите программу, чтобы удалить биты, которые не вызывают проблемы. Ваша проблема, по-видимому, является потребителем очереди, которая заполняется. Почему не так быстро читается потребитель? Hvae вы рассмотрели использование ExecutorService, который обертывает очередь и пулы потоков. Часто это проще в использовании, чем написание собственного пула потоков и очереди. –

+0

Вы можете использовать какой-то инструмент, например jstack (или jconsole), чтобы создать дамп потока и посмотреть, что делают ваши потребительские потоки в то время. Возможно, у вас есть тупик, который совершенно сложно воспроизвести поэтапно. – Claudio

ответ

2

«Отладить его», используя регистратор. Мне нравится SLF4J.

Настройте log.debug операторы до и после каждой критической операции. Используйте log.entering и log.exiting вызовы в начале и в конце каждого метода.

В то время как вы «отлаживаете», вы запустите свое приложение с установленным регистратором на очень низком уровне (FINEST), а затем запустите приложение и наблюдайте за инструкциями по протоколированию, чтобы узнать, когда он не работает, и каково состояние при сбое ,

Поскольку вы беспокоитесь о проблеме с потоками, убедитесь, что ваш формат журнала содержит имя или номер потока.

1

общие рекомендации?

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

Пример:

Тема 1:

ResourceA.lock(); 
ResourceB.lock(); 
... 
ResourceB.unlock(); 
ResourceA.unlock(); 

Тема 2:

ResourceB.lock(); 
ResourceA.lock(); 
... 
ResourceA.unlock(); 
ResourceB.unlock(); 

Теперь, если поток 1 прерывается, когда он уже владеет ResourceA, но еще не ResourceB, и нити 2 разрешено работать, поток 2 будет принимать ResourceB. Затем нить 1 владеет ResourceA и ждет ResourceB, а нить 2 владеет ResourceB и ждет ResourceA, поэтому у вас есть тупик.

+0

Отличное понимание, большое спасибо – user3607022

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