У меня есть программа, которая работает около 50 threads
. Я использую шаблон дизайна потребителя для передачи данных между потоками. После того, как программа работает некоторое время, иногда она зависает из-за того, что я использую BlockingQueue для распространения данных между потоками, и поэтому основная часть дистрибутива программы блокируется при попытке добавить данные в этот BlockingQueue. Другими словами, один из потоков останавливается по какой-то причине, а затем блокирующийQueue, который он использует для приема данных, становится полным.Многопоточная отладка в java
Как я могу отлаживать это эффективным образом? Я попытался окружить контент во всех методах run()
с помощью catch(Exception e)
, но ничто никогда не бросается. Я развиваюсь в Java/IntelliJ
.
Любые мысли, идеи или общие рекомендации?
Не могли бы вы выслать какой-нибудь код? – Sildoreth
Упростите программу, чтобы удалить биты, которые не вызывают проблемы. Ваша проблема, по-видимому, является потребителем очереди, которая заполняется. Почему не так быстро читается потребитель? Hvae вы рассмотрели использование ExecutorService, который обертывает очередь и пулы потоков. Часто это проще в использовании, чем написание собственного пула потоков и очереди. –
Вы можете использовать какой-то инструмент, например jstack (или jconsole), чтобы создать дамп потока и посмотреть, что делают ваши потребительские потоки в то время. Возможно, у вас есть тупик, который совершенно сложно воспроизвести поэтапно. – Claudio