corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Отладка многопоточных приложений в среде IDE NetBeans

В этом документе описано использование окна "Debugging" в среде IDE NetBeans для отладки многопоточных приложений. В данном руководстве также представлены способы использования среды IDE для обнаружения взаимоблокировок в приложении.

Процесс отладки значительно упрощен, поскольку вся информация о сеансах отладки, потоках выполнения и стеках вызовов потоков выполнения представлена в одном окне "Debugging". В окне "Debugging" удобно просматривать состояние потоков выполнения, а также приостанавливать и возобновлять выполнение любого потока в сеансе.

С целью демонстрации работы с окном "Debugging" в данном руководстве используются два примера проектов. В соответствии с указаниями в этом руководстве сначала загрузите, а затем откройте проекты "Gallery" и "Deadlock".

Содержание

Содержимое на этой странице относится к среде IDE NetBeans 6.7, 6.8, 6.9, 7.0

Для работы с этим руководством требуется программное обеспечение и ресурсы, перечисленные ниже.

Программное обеспечение или ресурс Требуемая версия
Среда IDE NetBeans 6.7, 6.8, 6.9, 7.0
Комплект для разработчика на языке Java (JDK) версия 6 или
версия 5
Проекты "Gallery" и "Deadlock"  

Открытие проектов

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

Запуск проекта "Gallery"

Приложение "Gallery" представляет собой простое приложение Java Swing для воспроизведения анимированных изображений. В приложении имеются две кнопки, позволяющие добавлять и удалять анимированные изображения. В этом упражнении будет выполнен запуск приложения "Gallery".

  1. Загрузите и распакуйте архив debugging-samples.zip в локальной системе.
  2. В главном меню выберите "File > Open".
  3. В каталоге примеров приложений для отладки найдите и выберите проект "Gallery". Нажмите кнопку "Open".

    При выборе "Open" в среде IDE проект будет открыт и выведен на экран в окне "Projects". После развертывания узла проекта в окне "Projects" видно, что он представляет собой простое приложение на Java для Swing.

  4. Для запуска приложения "Gallery" щелкните правой кнопкой мыши узел проекта и выберите "Run".
  5. В приложении "Gallery" нажмите кнопку "More" для добавления изображений и "Less" для удаления изображений.
    Снимок экрана приложения "Gallery"
  6. Закройте окно приложения "Gallery".

Проект "Gallery" является простым многопоточным приложением, отладка которого будет показана в этом учебном курсе.

Запуск проекта "Deadlock"

Приложение "Deadlock" содержит метод запуска потока выполнения main, который выполняется в течение 500 000 миллисекунд. Этот метод main запускает два потока выполнения, результаты которых отображаются в окне "Output".

  1. В главном меню выберите "File > Open".
  2. В каталоге примеров приложений для отладки найдите и выберите проект "Deadlock". Нажмите кнопку "Open".

    При выборе "Open" в среде IDE проект будет открыт и выведен на экран в окне "Projects". После развертывания узла проекта в окне "Projects" видно, что он представляет собой простое приложение Java.

  3. Для запуска приложения "Deadlock" щелкните правой кнопкой мыши узел проекта и выберите "Run".

    При нажатии кнопки "Run" откроется окно "Output", в котором отображается следующая выходная информация.

    run:
    Application started
    MyThread2 successfully finished.
    MyThread1 successfully finished
  4. Пусть приложение завершит работу (пять минут).

    По завершении работы приложения "Deadlock" в окне "Output" должна отображаться следующая информация.

    Main thread finished

Проект "Deadlock" является простым приложением Java с двумя потоками выполнения. После отладки приложения будет создана взаимоблокировка с целью демонстрации возможностей среды IDE по обнаружению взаимоблокировок.

Отладка примеров проектов

Проект "Gallery" представляет собой простое приложение Java Swing для воспроизведения анимированных изображений. Добавление и удаление изображений в приложении осуществляется путем нажатия соответствующих кнопок. При нажатии кнопки "More" запускается новый поток выполнения, который выводит на экран и анимирует изображение. При нажатии кнопки "Less" останавливается самый новый поток выполнения, в результате чего анимация останавливается и изображение удаляется.

Приостановка потоков выполнения

В этом упражнении выполняется запуск отладки приложения "Gallery" и добавляются несколько изображений для запуска нескольких потоков приложения. После запуска сеанса отладки в левой области окна IDE открывается окно "Debugging". В окне "Debugging" отображается список потоков выполнения данного сеанса.

  1. Щелкните правой кнопкой мыши проект "Gallery" в окне "Projects" и выберите "Debug".

    После нажатия кнопки "Debug" в среде IDE запускается приложение "Gallery", и открываются окна отладки по умолчанию. Окно "Debugging" автоматически открывается в левой области главного окна, а окно "Debugger Console" – в окне "Output".

  2. Трижды нажмите кнопку "More" в приложении "Gallery" для запуска трех потоков выполнения для воспроизведения анимированных изображений.

    В окне "Debugging" отобразится процесс запуска новых потоков выполнения для каждой анимации.

    Пример экрана: окно "Debugging"
  3. Приостановите два потока выполнения путем нажатия кнопки "Suspend thread" справа от каждого потока в окне "Debugging".

    Если поток выполнения приостановлен, соответствующий значок изменится, отражая его новое состояние. Для просмотра стека вызовов потока выполнения можно развернуть узел этого потока. Для открытия контекстного меню с командами отладки щелкните правой кнопкой мыши отдельные элементы в окне "Debugging".

    Пример экрана: окно "Debugging" с двумя приостановленными потоками выполнения

    При просмотре приложения "Gallery" видно, что после приостановки потоков выполнения анимация для этих потоков прервалась.

Окно "Debugging" позволяет быстро просматривать и изменять состояние потоков выполнения в сеансе. По умолчанию в окне "Debugging" кнопки "Resume" и "Suspend" располагаются в правой области окна. Эти кнопки можно скрыть, после чего настроить вид окна "Debugging" с помощью панели инструментов в нижней области этого окна. При выполнении нескольких сеансов отладки для выбора сеанса, который должен отображаться в окне, можно использовать раскрывающийся список в верхней области окна "Debugging".

Пример экрана: панель инструментов окна "Debugging"

Переключение потоков выполнения

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

  1. Разверните пакет файлов gallery в окне "Projects" и дважды щелкните Gallery.java для открытия этого файла в редакторе.
  2. В файле Gallery.java вставьте точку останова в начало метода run путем щелчка в левом поле строки 174.
  3. В приложении "Gallery" нажмите кнопку "More" для запуска нового потока выполнения, который достигнет установленной в методе точки останова.
  4. Для пошагового выполнения метода нажмите "Step Over" (F8).

    В счетчике команд в поле редактора отображается текущее положение в коде при пошаговом выполнении метода.

  5. Нажмите кнопку "More" в приложении "Gallery" для запуска нового потока выполнения, который должен достичь точки останова.

    Когда новый поток выполнения достигнет точки останова, установленной в методе, в окне "Debugging" появится уведомление "New Breakpoint Hit", информирующее о том, что еще один поток выполнения достиг точки останова в процессе последовательного выполнения метода.

    Пример экрана: уведомление "New Breakpoint Hit"

    Когда в процессе последовательного выполнения потока другой поток выполнения достигает точки останова, в среде IDE предлагается возможность выбора: переключение на другой поток выполнения или продолжение пошагового выполнения текущего потока. Для переключения на поток выполнения, достигший точки останова, в уведомлении "New Breakpoint Hit" можно нажать кнопку со стрелкой. На новый поток выполнения можно переключиться в любой момент путем выбора потока в окне уведомления. При выборе пошагового выполнения текущего потока, достигшего точки останова, возобновляется текущий поток выполнения, однако состояние других потоков приложения остается неизменным.

    Примечание. В окне "Debugging" можно увидеть, что текущий поток выполнения (Thread_Jirka) отмечен в поле зеленой полосой. Поток выполнения, инициировавший уведомление при достижении точки останова (Thread_Roman), отмечен желтой полосой, а значок этого потока указывает на то, что данный поток выполнения приостановлен, поскольку достигнута точка останова.

    Пример экрана: уведомление "New Breakpoint Hit"
  6. Для переключения между текущим потоком выполнения и новым потоком (Thread_Roman) в уведомлении "New Breakpoint Hit" нажмите кнопку со стрелкой.

    После переключения на новый поток выполнения на экране можно увидеть следующее:

    • Счетчик команд переместился в позицию, соответствующую строке 175 в новом текущем потоке выполнения (Thread_Roman).
    • В поле строки 191 появилась аннотация приостановки потока, указывающая на то, что поток выполнения (Thread_Jirka) приостановлен на этой строке.
    Пример экрана: аннотациями отладки в редакторе
  7. Для пошагового выполнения нового текущего потока (Thread_Roman) несколько раз нажмите "Step Over".
  8. Щелкните правой кнопкой мыши аннотацию приостановки потока в поле редактора и выберите "Set as Current Thread > Thread_Jirka" для обратного переключения на приостановленный поток.
    Пример экрана: всплывающее окно "Set as Current Thread" в редакторе

    В качестве альтернативы можно вызвать окно "Current Thread Chooser" (Alt+Shift+T) и переключиться на любой из потоков приложения.

    Пример экрана: приложение "Gallery"

При обратном переключении на поток Thread_Jirka напротив строки, на которой был приостановлен поток Thread_Roman, появится аннотация приостановки потока. Возобновить поток Thread_Roman можно путем нажатия кнопки "Resume" в окне "Debugging".

Пример экрана: аннотации отладки в редакторе

Окно "Debugging" обеспечивает точное представление и контроль состояний потоков выполнения. Отладчик управляет потоками приложения, что упрощает процесс отладки и предотвращает возникновение взаимоблокировок. В этом упражнении были рассмотрены следующие принципы отладки приложения в среде IDE.

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

Теперь можно выйти из приложения "Gallery". В следующем упражнении будет выполнена отладка приложения "Deadlock" и продемонстрировано использование среды IDE для обнаружения взаимоблокировки.

Обнаружение взаимоблокировок

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

Для изучения процесса обнаружения взаимоблокировки в среде IDE необходимо запустить в отладчике демонстрационный проект "Deadlock" и создать ситуацию взаимоблокировки.

  1. Разверните пакет myapplication и откройте файлы Thread1.java и Thread2.java в редакторе исходного кода.
  2. Установите точку останова для Thread1.java в строке 20 и для Thread2.java в строке 20.

    Для установки точки останова в поле редактора исходного кода щелкните поле напротив строки, в которой требуется установить точку останова. В левом поле напротив этой строки появится аннотация точки останова. Если открыть окно "Breakpoints" (Alt-Shift-5), то в нем можно увидеть, что установлены и активированы две точки останова.

    Пример экрана: окно редактора с установленной в строке 20 точкой останова
  3. Щелкните правой кнопкой мыши проект "Deadlock" в окне "Projects" и выберите "Debug".

    При вызове метода main будут запущены эти два потока выполнения, при этом оба потока будут приостановлены в одной из точек останова. Потоки, приостановленные в точках останова, можно просмотреть в окне "Debugging".

  4. В окне "Debugging" возобновите приостановленные потоки выполнения (MyThread1 и MyThread2) путем нажатия кнопки "Resume" справа от приостановленных потоков.
    Пример экрана: возобновление приостановленных потоков в окне "Debugging"

    Возобновление потоков выполнения MyThread1 и MyThread2 приведет к возникновению ситуации взаимоблокировки.

  5. Выберите в главном меню команду "Debug\Check for Deadlock" для проверки приостановленных потоков выполнения на наличие взаимоблокировок.
    Пример экрана: возобновление приостановленных потоков в окне "Debugging"

    Если в ходе проверки приложения обнаружена взаимоблокировка, в окне "Debugging" появится сообщение, информирующее об этой ситуации. Потоки выполнения, находящиеся во взаимоблокировке, отмечаются красной полосой в левом поле окна "Debugging".

Настоящий учебный курс является общим введением в некоторые из функций отладки в среде IDE. Окно "Debugging" позволяет без труда приостанавливать и возобновлять потоки выполнения при отладке приложений. Это чрезвычайно удобно при отладке многопоточных приложений.



Дополнительные материалы

Для получения дополнительных сведений о разработке и тестировании приложений Java в среде IDE NetBeans см. следующие материалы: