Рубрики
Без рубрики

Изучите инструменты IntelliJ IDEA для отладки многопоточных Java-приложений

Отладка проблем параллелизма или условий гонки в вашем коде обычно затруднена. Этот пост должен быть g… Помечено как начинающие, java, многопоточность, инструменты разработки.

Отладка проблем параллелизма или условий гонки в вашем коде обычно затруднена. Этот пост должен дать вам хорошее начало для отладки многопоточных Java-приложений.

Мы будем учиться на собственном примере. Здесь я написал многопоточную программу для вычисления этой математической задачи: 100! + 100000!

Вот что происходит в приведенном выше коде: Мы инициализируем, называем и запускаем два потока – “Поток 1” (для вычисления 100!) и “Поток 2” (для вычисления 100000!). Затем в методе main() мы вызываем thread1.join() , чтобы основной поток не выполнялся дальше, пока не вернется “Поток 1”. Аналогично, мы вызываем thread2.join() Использование метода Thread.join() гарантирует, что сумма (в строке 25) не вычисляется до тех пор, пока оба потока не вернутся, то есть сложение выполняется только после того, как мы получим факториалы 100 и 100000.

Давайте рассмотрим инструменты IntelliJ IDEA (v. 2019.2.2 (CE)), которые я часто использую при отладке многопоточного приложения.

Рамы и резьбовые панели

Окно инструмента отладки имеет Панель рамок , которая состоит из выпадающего списка. Он фокусируется на потоке, который в данный момент приостановлен из-за точки останова, и показывает стек вызовов этого потока. На изображении ниже точка останова находится в методе main(), а кадр показывает нам стек вызовов для основного потока.

Если вы хотите проверить стек вызовов других потоков, вы можете выбрать их из выпадающего списка.

Панель потоков показывает все потоки, которые в данный момент активны. Ссылаясь на приведенный выше код, я добавил точку останова в thread1.join() (в строке 18). Когда приложение останавливается в этой точке останова, мы должны увидеть по крайней мере три потока – “основной”, “Поток 1” и “Поток 2” на этой панели (см. скриншот ниже). Вы можете дважды щелкнуть по каждому потоку, чтобы просмотреть их стеки вызовов.

Выборочная отладка

Предположим, что я устраняю ошибку в этой программе, и мне нужно приостановить выполнение только для “потока 2”, как только он начнет работать. Это говорит о том, что мне нужно добавить точку останова в первую строку метода run() потока факториальных вычислений (строка 39). Но мы столкнемся с проблемой – все потоки, которые столкнутся с точкой останова, будут приостановлены. Это включает в себя “Поток 1” и “Поток 2” для нашего приложения. Я не хочу, чтобы оба потока останавливались. Можете ли вы придумать какой-нибудь другой подход?

Мы можем использовать функцию условной точки останова. Давайте посмотрим, как это сделать. После добавления точки останова щелкните по ней правой кнопкой мыши, установите флажок “Приостановить” и выберите “Поток”. Затем мы добавляем условие, как показано на скриншоте ниже. Это условие гарантирует, что отладчик приостановит текущий поток только в том случае, если имя этого потока “Поток 2”:

Теперь отладьте программу. Когда приложение приостанавливается, приостанавливается только “Поток 2”. Вы можете подтвердить, что “Поток 1” был выполнен и не был приостановлен, выполнив следующие действия:

1.In консоль, вы можете проверить через журналы, что “Поток 1” запущен и завершен.

2.In на панели “Потоки” вы можете проверить, нет ли “Потока 1”

Способ настройки условных точек останова может отличаться в разных версиях IDE. Но ключевая идея состоит в том, чтобы знать об этих функциях и использовать их.

Счастливой отладки!

Подписывайтесь на меня в Твиттере @amish1502

Рекомендации:

Оригинал: “https://dev.to/shahamish/explore-intellij-idea-tools-to-debug-multithreaded-java-apps-12bi”