Olá desenvolvedores, hoje prosseguiremos com a Implementação do processo de Fila e Pilha com Thread. No tutorial passado começamos nosso aprendizado sobre Filas e Pilhas. Aprendemos que quando se trata de filas o primeiro elemento a entrar é o primeiro elemento a sair. Ao passo que em pilhas o último a entrar é o primeiro a sair.

Implementamos e preparamos toda a estrutura para adicionar dados à fila, processar (pelo método run()) e remover. Para isso recorremos ao uso da classe ConcurrentLinkedQueue, utilizada essencialmente em processamento paralelo ou concorrente junto com as threads. E para percorrer a lista promovendo iteração utilizamos o framework padrão do Java, o Iterator.

Dentro do laço de repetição while, que aliás faz parte do escopo do método synchronized, ficou estabelecido que enquanto existisse dados na fila o processamento continuaria. A função do synchronized é impedir que outros processos tenham acesso a lista prejudicando o seu processamento.

E por fim, pensando na limpeza da memória implementamos duas threads sleep. Com esta implementação determinamos um tempo entre o processamento de um dado e outro e ao final do laço de repetição.

E para que possamos implementar o processo de filas e pilhas com threads, iremos modificar a tela que já temos pronta. As modificações objetivam tornar possível que por meio da tela possamos adicionar dados para a lista. Nossa intenção é exemplificar a implementação do processamento de uma grande massa de dados.

MODIFICANDO A INTERFACE GRÁFICA DO SISTEMA

A primeira providência é, apagar as threads implementadas na classe TelaTimeThread, bem como toda as referências a ela apontadas pela IDE. Apagaremos também todos os “enableds”. Já aproveitando para alterar também os rótulos (labels), adequando-os. Agora ao executar teremos a nossa tela com todos os campos e botões habilitados, diferente de como havíamos deixado anteriormente.

Note que alteramos também o nome do botão, visto que agora iremos adicionar os dados a lista sempre que clicarmos no botão “ADD LISTA”.

Pegaremos a implementação “ImplementacaoFilaThread” e a partir dela criaremos um objeto, dessa forma quando a tela for instanciada já teremos o objeto “fila” criado dentro dela.

private ImplementacaoFilaThread fila = new ImplementacaoFilaThread();   

E podemos testar para verificarmos se realmente nossa thread está rodando, então imprimiremos uma simples mensagem no console. Assim, no método responsável pela execução da thread, o run(), implemente o método print com uma mensagem qualquer.

System.out.println(“FILA RODANDO”);

Porém, lembre-se de “startar” a thread. Ou seja, na classe TelaTimeThread, antes do setVisible, inicie a “fila”.

fila.start();

Se tudo estiver correto, tão logo executemos o código a mensagem será exibida em segundo plano.

IMPLEMENTANDO AS FILAS

O passo seguinte e o mais legal é escrever o código que irá possibilitar adicionar os dados a lista.

Quando clicamos no botão “ADD LISTA”, executamos o ActionListener responsável por receber o evento. O ActionListener implementa um actionPerformed que identifica a ocorrência de um evento. É dentro do actionPerformed que instanciaremos o ObjetoFilaThread que receberá os dados de nome e e-mail.

ObjetoFilaThread filaThread = new ObjetoFilaThread();

filaThread.setNome(mostraTempo1.getText());
filaThread.setEmail(mostraTempo2.getText());

Os mostraTempo1 e mostraTempo2 são os identificadores do campo de texto por meio do qual passaremos os dados.

Agora com o objeto que controla a fila para que possa receber o objeto com os dados da tela e adicioná-los a lista/fila.

fila.add(filaThread);

No tutorial anterior, deixamos a estrutura para imprimir no console pronta, onde no método run() pegaremos os dados inseridos e imprimiremos.

System.out.println("NOME..: " +processar.getNome());
System.out.println("E-MAIL: " +processar.getEmail());

Lembrando que também no tutorial anterior, foi necessário mover o Interator para dentro do bloco synchronized que por sua vez foi envolvido por um novo bloco while. O while possibilitará o processamento e a sincronização enquanto houver dados para serem processados.

while(true) {

synchronized(pilha_fila){
Iterator iteracao = pilha_fila.iterator();

while(iteracao.hasNext()){
}
}}

Ao executarmos, poderemos adicionar os dados enquanto desejarmos. Isto é, poderemos tanto adicionar novos dados como adicionar os mesmos, apenas clicando seguidamente no “AD LISTA”. E assim, enquanto estes dados estiverem sendo processados, o sistema estará liberado para executar outras tarefas.

EM POUCAS PALAVRAS

Colocamos nossa thread para rodar com sucesso, os exemplos embora pareçam simples, irão fornecer toda a base necessária. É importante que você reveja estas aulas sobre threads, e tente implementar sozinho, recorra aos tutoriais e as aulas sempre que tiver dúvida. Mas pratique, o segredo está em praticar continuamente. Eu fico por aqui, nos vemos no próximo tutorial.