Olá desenvolvedores, o objetivo deste tutorial é aprender a controlar uma thread iniciando-a e parando quando desejarmos. Este controle será feito a partir da tela implementada nos tutoriais passados.

Tencionando tornar esta experiência o mais real possível, e sem perder o cunho didático, desenvolvemos uma tela a qual implementamos dois botões, rótulos e campos de texto respectivamente. Assim poderemos iniciar ou parar o processamento da thread em qualquer tempo, porém, ela ficará atualizando até que a “matemos”.

CONTROLANDO O CAMPO DATA E HORA

Criaremos a thread para depois trabalharmos com ela como um objeto e para isso iremos implementar um Runnable. A interface Runnable nos possibilitará também escrever códigos mais enxutos.

private Runnable thread1 = new Runnable(){
}

Dentro de Runnable deveremos adicionar o método run(), responsável pela execução da thread.

public void run(){
}

E no escopo do método run() implementaremos um código que mediante o start irá atualizar data e hora sem parar até que uma instrução de parada seja enviada. E se esta atualização se dará até que uma instrução deparada seja enviada, ou seja até que “matemos” a thread, a estrutura de repetição a ser implementada é o laço de repetição while.

While(true){
}

Mas queremos poder visualizar na tela a atualização dos segundos e minutos, e poderemos conseguir este efeito a partir da uma instrução que imprime um formato de data e hora. Essa instrução irá transformar a data e hora que serão passados para um formato especificado, e os retornará em um setText.

mostraTempo_01.setText(newSimpleDateFormat("dd/MM/yyy hh:mm.ss").
format(Calendar.getInstance().getTime()));

Detalhando um pouco mais a linha de código acima, temos um getTime passando um “Date”. Este “Date” será recebido e formatado pelo “format” que por sua vez retornará uma String para o setText.

E como a iteração do while acontece de forma muito rápida, será necessário forçar um intervalo de tempo, para que no decorrer do processamento o computador não trave. Assim, dentro do while chamaremos o sleep e informaremos uma pausa de um segundo entre cada iteração.

Thread.sleep(1000);
 

E como sempre é quando adicionamos o sleep, a IDE nos solicita que seja implementada uma exceção com o try/catch. Clicando na lâmpada a esquerda, o código será automaticamente preenchido. Fora da Runnable criaremos o objeto de thread, para que seja possível acessá-lo de todos os lugares dentro da sistema.

Private Thread thread1Time;

ASSOCIANDO OS BUTTONS AS SUAS FUNÇÕES

Precisamos agora associar os bottons, start e stop as suas respectivas funções. Isto é, adicionar os eventos de dar início ao processamento da thread e de “mata-la”. Então implementaremos um evento que indicará a ocorrência de uma ação definida por componente, ou seja, um button.

Em linhas gerais significa que o evento é passado para todos os objetos do ActionListener que foi implementado para receber esses eventos usando o método addActionListener do componente. O objeto que implementa o ActionListener interconecta este ao ActionEvent quando o mesmo ocorre.

jButton_01.addActionListener(new ActionListener() { 
}

Assim, dentro do ActionListener teremos um actionPerformed que em suma significa uma identificação de evento indicando que ocorreu uma ação significativa. E dentro teremos uma thread recebendo um Runnable, responsável pela execução do código que exibirá a data e hora atualizados. E por fim, implementaremos a linha de código responsável por “startar” a thread, que ficará processando o run() em segundo plano.

public void actionPerformed(ActionEvent e) {

thread1Time = new Thread(thread1);
thread1Time.start();
}

E de forma semelhante procederemos com a implementação do evento de parar o processamento da thread.

jButton_01.addActionListener(new ActionListener() { 

public void actionPerformed(ActionEvent e){
thread1Time.start();
}
});

HABILITANDO E DESABILITANDO BUTTONS

Não faz sentido que ao executarmos o programa a tela abra com o botão stop habilitado, iremos então desabilitá-lo. Assim depois da adição do segundo evento, iremos adicionar a linha de código responsável por desabilitar o botão.

jButton2.setEnabled(false);

No entanto, quando startarmos o evento, o “stop” deverá ser automaticamente habilitado. Desse modo, dentro do ActionListener do referido botão, iremos desabilitar o botão de iniciar e habilitar o de parar.

jButton1.setEnabled(false);
jButton2.setEnabled(true);

Agora dentro do ActionListener do botão de parar, iremos proceder de forma contrária habilitar o botão de iniciar quando o botão de parar estiver desabilitado.

jButton1.setEnabled(true);
jButton2.setEnabled(false);

EM POUCAS PALAVRAS

O tutorial de hoje nos trouxe muitos novos conhecimentos, e de um jeito divertido estamos quase concluindo o nosso trabalho. A implementação da segunda thread é exatamente a mesma coisa, mudando apenas a referência ao campo e a thread. Fica para você o desafio da implementação. Você pode, por exemplo, mudar a máscara da data/hora da segunda thread de forma distingui-las. Eu fico por aqui, nos vemos no próximo tutorial.