Depurando aplicativos multithreaded no NetBeans IDE
Este documento descreve como usar a janela Depuração no NetBeans IDE para depurar aplicativos multithreaded. O tutorial também demonstra como usar o IDE para detectar impasses em um aplicativo.
A janela Depuração simplifica o processo de depuração integrando em uma janela as informações sobre sessões de depuração, threads de aplicativos e pilhas de chamadas de threads. A janela Depuração permite que você veja facilmente o status dos threads de aplicativos para suspender e retomar qualquer um dos threads na sessão.
Este tutorial usa dois projetos de amostra para demonstrar como trabalhar com a janela Depuração. Para concluir este tutorial, primeiro faça o download e abra os projetos Gallery e Deadlock.
Conteúdo
Para seguir este tutorial, você precisa dos seguintes recursos e softwares.
Fazendo download de projetos de amostra
Você pode fazer o download dos projetos de amostra usados neste tutorial das seguintes formas:
Abrindo os projetos
Neste tutorial você usará dois aplicativos para demonstrar o suporte do IDE para a depuração de aplicativos multithreaded. Neste exercício, você abrirá e executará os dois projetos no IDE. Depois de executar os projetos, será necessário depurar cada um deles.
Executando o projeto Gallery
Gallery é um aplicativo Java Swing simples que reproduz imagens animadas. O aplicativo tem dois botões que permitem adicionar e remover imagens animadas. Neste exercício, você executará o aplicativo Gallery.
- Faça o download e descompacte o arquivo debugging-samples.zip em seu sistema local.
- Escolha Arquivo > Abrir no menu principal.
- Localize e selecione o projeto Gallery no diretório debugging-samples. Clique em Abrir.
Quando você clicar em Abrir, o IDE abrirá e exibirá o projeto na janela Projetos. Se você expandir o nó do projeto na janela Projetos, poderá observar que o projeto é um aplicativo Java Swing simples.
- Clique com o botão direito do mouse no nó do projeto e escolha Executar para iniciar o aplicativo Gallery.
- No aplicativo Gallery, clique em "Mais" para adicionar imagens e clique em "Menos" para remover imagens.
- Feche a janela do aplicativo Gallery.
O projeto Gallery é um aplicativo multithreaded simples que você irá depurar neste tutorial.
Executando o projeto Deadlock
O aplicativo Deadlock contém um método main que inicia um thread, executado durante 500000 milissegundos. O método main inicia dois threads que imprimem na janela Saída quando concluídos.
- Escolha Arquivo > Abrir no menu principal.
- Localize e selecione o projeto Deadlock no diretório debugging-samples. Clique em Abrir.
Quando você clicar em Abrir, o IDE abrirá e exibirá o projeto na janela Projetos. Se você expandir o nó do projeto na janela Projetos, observará que o projeto é um aplicativo Java simples.
- Clique com o botão direito do mouse no nó do projeto e escolha Executar para iniciar o aplicativo Deadlock.
Quando você clica em Run, a janela Saída abre e exibe a saída a seguir.
executar:
Aplicativo iniciado
MyThread2 concluído com êxito.
MyThread1 concluído com êxito.
- Permita que o aplicativo finalize normalmente (cinco minutos).
Quando o aplicativo Deadlock finalizar, será exibido o seguinte na janela Saída.
Thread principal concluído
O projeto Deadlock é um aplicativo Java simples com dois threads. Quando você depurar o aplicativo, criará um impasse para ilustrar como o IDE pode ajudá-lo a detectar impasses.
Depurando os projetos de amostra
O projeto Gallery é um aplicativo Java Swing simples que exibe imagens animadas. Você adiciona e remove as imagens clicando nos botões do aplicativo. Clicar no botão "Mais" inicia um novo thread que exibe e anima uma imagem. Clicar no botão "Menos" pára o thread mais recente, interrompendo a animação e removendo a imagem.
Suspendendo threads
Neste exercício, você começa a depuração do aplicativo Gallery e adiciona imagens para iniciar alguns threads do aplicativo. Quando você inicia uma sessão de depuração, o IDE abre a janela Depuração no painel esquerdo do IDE. A janela Depuração exibe uma lista dos threads na sessão.
- Clique com o botão direito do mouse no projeto Gallery na janela Projetos e escolha Depurar.
Quando você clica em Depurar, o IDE inicia o aplicativo Gallery e abre as janelas de depuração padrão. O IDE abre automaticamente a janela Depuração no lado esquerdo da janela principal e abre o Console do depurador na janela Saída.
- Clique três vezes em "Mais" no aplicativo Gallery para iniciar três threads que exibem imagens animadas.
Se você observar a janela Depuração, poderá verificar que um novo thread foi iniciado para cada animação.
- Suspenda dois threads clicando no botão "Suspender thread" à direita do thread, na janela Depuração.
Quando um thread é suspenso, o ícone do thread é alterado para indicar o novo estado. Você pode expandir o nó thread para visualizar a pilha de chamadas do thread. Você pode clicar com o botão direito do mouse nos itens na janela Depuração para abrir um menu suspenso com os comandos de depuração.
Se você observar o aplicativo Gallery, poderá verificar que, quando você suspendeu os threads, a animação desses threads foi interrompida.
A janela Depuração permite que você veja rapidamente e altere o status dos threads na sessão. Por padrão, a janela Depuração exibe os botões Retomar e Suspender no lado direito da janela. É possível ocultar os botões e personalizar ainda mais a exibição da janela Depuração usando a barra de ferramentas na parte inferior da janela Depuração. Se você estiver executando várias sessões de depuração, poderá usar a lista suspensa na parte superior da janela Depuração para escolher qual sessão será exibida na janela.
Alternando threads
Este exercício demonstra o que acontece quando você está avançando passo a passo no aplicativo e um thread diferente do aplicativo atinge um ponto de interrupção. Neste exercício você definirá um ponto de interrupção do método e iniciará o passo a passo no aplicativo. Enquanto estiver avançando passo a passo no aplicativo, você iniciará um novo thread que também atingirá o ponto de interrupção. O IDE informa quando isso ocorre, exibindo uma notificação na janela Depuração. Em seguida, você irá alternar entre os threads.
- Expanda o pacote gallery na janela Projetos e clique duas vezes em Gallery.java para abrir o arquivo no editor.
- Insira um ponto de interrupção do método em Gallery.java no início do método run clicando na margem esquerda, na linha 174.
- Clique em "Mais" no aplicativo Gallery para iniciar um novo thread que atingirá o ponto de interrupção do método.
- Clique em Passar sobre (F8) duas vezes para iniciar o passo-a-passo pelo método.
Você observará que o Contador do programa na margem do editor indica sua posição à medida que você avança passo a passo pelo método.
- Clique em "Mais" no aplicativo Gallery para iniciar um novo thread que atingirá o ponto de interrupção do método.
Quando o novo thread atingir o ponto de interrupção do método, uma notificação de Novo ponto de interrupção atingido será exibida na janela Depuração, informando que outro thread atingiu um ponto de interrupção enquanto você avançava passo a passo pelo método.
Quando você estiver avançando passo a passo por um thread, e um ponto de interrupção for atingido em outro thread, o IDE oferecerá a opção de alternar para o outro thread ou continuar a avançar passo a passo pelo thread atual. Você pode clicar no botão de seta na notificação de Novo ponto de interrupção atingido para alternar para o thread que encontrou o ponto de interrupção. Você pode alternar para o novo thread a qualquer momento selecionando o thread na janela de notificação. Avançar passo a passo pelo thread do ponto de interrupção atual retoma o thread atual, porém o status de outros threads do aplicativo permanecem inalterados.
Observação. Se você observar a janela Depuração, poderá verificar que o thread atual (Thread_Jirka) é indicado por uma barra verde na margem. O thread que invocou a notificação atingindo o ponto de interrupção (Thread_Roman) é indicado por uma barra amarela e o ícone do thread indica que o thread está suspenso por um ponto de interrupção.
- Clique na seta, na notificação Novo ponto de interrupção atingido, para alternar o thread atual para o novo thread (Thread_Roman).
Quando alternar para o novo thread, você observará o seguinte:
- O contador do programa se move para a posição na linha 175 no novo thread atual (Thread_Roman).
- Uma anotação "thread suspenso" ficará visível na margem, na linha 191, indicando que um thread (Thread_Jirka) está suspenso nessa linha.
- Clique em Passar sobre algumas vezes para avançar passo a passo pelo novo thread atual (Thread_Roman).
- Clique com o botão direito do mouse na anotação "thread suspenso" na margem do editor e escolha Definir como thread atual > Thread_Jirka para voltar ao thread suspenso.
Como alternativa, você pode invocar o Seletor de thread atual (Alt+Shift+T) e alternar para qualquer um dos threads do aplicativo.

Quando você voltar para o Thread_Jirka, a anotação do thread suspenso será exibida ao lado da linha onde o Thread_Roman foi suspenso. Você pode retomar o Thread_Roman clicando em Retomar, na janela Depuração.
A janela Depuração permite que você veja e controle com muita precisão os estados dos threads. O depurador gerencia os threads do aplicativo para simplificar o fluxo de trabalho de depuração e para evitar que o processo de depuração crie impasses. Neste exercício, você observou o seguinte comportamento durante a depuração de um aplicativo no IDE.
- Quando um thread atinge um ponto de interrupção, somente o thread do ponto de interrupção é suspenso.
- Ao avançar passo a passo pelo apilcativo, o thread atual não é afetado quando outros threads atingem os pontos de interrupção.
- O passo a passo retoma somente o thread atual. Quando a etapa é concluída, somente o thread atual é suspenso.
Você pode sair do aplicativo Gallery. No próximo exercício, você irá depurar o aplicativo Deadlock e usará o IDE para ajudar a detectar o impasse.
Detectando impasses
O IDE pode ajudar a identificar possíveis situações de impasse pesquisando automaticamente em todos os threads suspensos. Quando um impasse é detectado, o IDE exibe uma notificação na janela Depuração e identifica os threads envolvidos.
Para demonstrar a detecção de impasses do IDE, você executará o projeto de amostra Deadlock no depurador e criará uma situação de impasse.
- Expanda o pacote myapplication e abra o Thread1.java e Thread2.java no editor de código-fonte.
- Defina um ponto de interrupção em Thread1.java, na linha 20, e em Thread2.java, na linha 20
Para definir o ponto de interrupção, clique na margem do editor de código-fone, próximo à linha onde você deseja definir o ponto de interrupção. A anotação do ponto de interrupção é exibida na margem esquerda, perto da linha. Se você abrir a janela Pontos de interrupção (Alt-Shift-5), poderá verificar que os dois pontos de interrupção estão definidos e ativados.
- Clique com o botão direito do mouse no projeto Deadlock, na janela Projetos, e escolha Depurar.
O método main executará os dois threads e ambos serão suspensos em um dos pontos de interrupção. Você pode visualizar os threads suspensos pelos pontos de interrupção na janela Depuração.
- Na janela Depuração, retome os threads suspensos (MyThread1 e MyThread2) clicando nos botões Retomar à direita dos threads suspensos na janela Depuração.
A retomada dos threads MyThread1 e MyThread2 criará o estado de impasse.
- Escolha Depurar\Verificar impasse no menu principal para verificar se há impasses nos threads suspensos.
Se você verificar o aplicativo e detectar um impasse, uma mensagem será exibida na janela Depuração que o informará sobre o impasse. Você pode observar que os threads no impasse são indicados com uma barra vermelha na margem esquerda da janela Depuração.
Este tutorial foi uma introdução básica a alguns dos recursos de depuração do IDE. A janela Depuração permite que você suspenda e retome facilmente os threads ao depurar um aplicativo. Isso pode ser extremamente útil quando você estiver depurando aplicativos multithreaded.
Veja também
Para obter mais informações sobre o desenvolvimento e teste de aplicativos Java no NetBeans IDE, veja os recursos a seguir: